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
3 Answers
Reset to default 6To 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.