Я начал создавать простое расширение для Google Chrome, которое добавит новый элемент контекстного меню, если щелкнуть правой кнопкой мыши ссылку или щелкнуть правой кнопкой мыши, когда выделен какой-либо текст. Этот пункт меню должен содержать текст в виде
Search for "{link/select text}" on XYZ
Если бы меня просто заинтересовал выделенный текст, я мог бы отформатировать заголовок так:
Search for "%s" on XYZ
Когда откроется контекстное меню,% s превратится в выделенный текст. Персиковый. Однако получить такое же поведение при наведении курсора на ссылку не так просто. Эта строка превращается в Search for "" on XYZ
, что, конечно, недопустимо. Мне нужно одинаковое поведение в обоих случаях.
Я создал аналогичное расширение для Firefox, где у вас есть событие onShown
, которое срабатывает при открытии контекстного меню и дает вам объект с обоими linkText
и selectionText
свойства. Я использую прослушиватель этого события, чтобы сохранить текст, который я хочу найти, в глобальной переменной и вызываю метод update
моего пункта контекстного меню.
К сожалению, я не смог найти пути к этому с помощью Chrome API для контекстных меню. Существует метод обновления, поэтому я мог изменить заголовок, но мне не удалось найти событие, подобное onShown
, где я мог бы получить два значения и вызвать этот метод обновления.
Пока это мой код:
var url = "https://www.some-website.com/search?q=";
var searchterm = "";
var contexts = ["selection","link"];
var title = `Search "%s" on XYZ`;
var id = "contextSearch";
// Install our extension when chrome.runtime.onInstalled is called
chrome.runtime.onInstalled.addListener(function() {
// Create the context menu item
chrome.contextMenus.create(
{
"id": id,
"title": title,
"contexts": contexts,
"onclick": contextMenuAction
},
// Show successful creation in log
function() {
console.log("successfully created");
});
});
function contextMenuAction(info, tab) {
console.log(info);
console.log(tab);
// Save the searchterm and open a new tab to execute the search
searchterm = info.selectionText;
chrome.tabs.create({url: url+searchterm});
}
Объекты info
и tab
не содержат никакой информации о тексте ссылки, и даже если бы они это сделали, это было бы слишком поздно, потому что мне нужно получить этот текст, когда открывается контекстное меню. Ты знаешь какой-нибудь способ добиться того, что я пытаюсь сделать? Было бы грустно, если бы у моего Chrome расширения было меньше функциональности, чем у Firefox one ...