admin管理员组

文章数量:1399754

I try to get the DOM I select by ContextMenu in Chrome Extension.

Code:

chrome.contextMenus.onClicked.addListener(function(info, tab){
  // the info.selectionText just the text, don not contains html.
});

chrome.contextMenus.create({
  title: "Demo",
  contexts: ["selection"],
  id: "demo"
});

but the info.selectionText don't contains the HTML DOM. Is there any way to get the selection dom in Chrome extension contextMenu?. Please suggest. thanks.

I try to get the DOM I select by ContextMenu in Chrome Extension.

Code:

chrome.contextMenus.onClicked.addListener(function(info, tab){
  // the info.selectionText just the text, don not contains html.
});

chrome.contextMenus.create({
  title: "Demo",
  contexts: ["selection"],
  id: "demo"
});

but the info.selectionText don't contains the HTML DOM. Is there any way to get the selection dom in Chrome extension contextMenu?. Please suggest. thanks.

Share Improve this question asked Jan 29, 2015 at 9:31 kenticnykenticny 5352 gold badges9 silver badges21 bronze badges 1
  • Possible duplicate of Get page selection including HTML? – Zach Saucier Commented Oct 17, 2016 at 12:34
Add a ment  | 

3 Answers 3

Reset to default 6

To access the selection, you will need to inject a content script into the page.

There, you can call getSelection() to get a Selection object and play with ranges in it to extract the DOM you need.

// "activeTab" permission is sufficient for this:
chrome.contextMenus.onClicked.addListener(function(info, tab){
  chrome.tabs.executeScript(tab.id, {file: "getDOM.js"})
});

getDOM.js:

var selection = document.getSelection();
// extract the information you need
// if needed, return it to the main script with messaging

You may want to take a look at Messaging docs.

If you want just selected text from context menu than you can do it by following code

function getClickHandler() {
    return function(info, tab) {
      // info.selectionText contain selected text when right clicking
      console.log(info.selectionText);
    };
  };


/**
 * Create a context menu which will only when text is selected.
 */
chrome.contextMenus.create({
  "title" : "Get Text!",
  "type" : "normal",
  "contexts" : ["selection"],
  "onclick" : getClickHandler()
});

How I solved it in v3 manifest:

chrome.contextMenus.onClicked.addListener(async (info, tab) => {
  const tabId = tab?.id;

  if (tabId && info.menuItemId === 'my menu item' && info.selectionText) {
    chrome.scripting.executeScript(
      {
        func: () => {
          const selection = window.getSelection();
          const range = selection?.getRangeAt(0);
          if (range) {
            const clonedSelection = range.cloneContents();
            const div = document.createElement('div');
            div.appendChild(clonedSelection);
            return div.innerHTML;
          }
        },
        target: {
          tabId,
        },
      },
      (result) => {
        const html = result[0].result;
        // do something with `html`
      },
    );
  }
});

This requires both scripting and activeTab permissions.

本文标签: javascriptGet Selection DOM in chrome extension contextmenuStack Overflow