Reputation: 525
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.
Upvotes: 4
Views: 4735
Reputation: 4463
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.
Upvotes: 0
Reputation: 789
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()
});
Upvotes: 0
Reputation: 77523
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.
Upvotes: 6