Триггер chrome.browserAction.onНажмите с помощью функции - PullRequest
8 голосов
/ 28 июня 2011

Я хочу вызвать клик, который прослушивает следующий код:

chrome.browserAction.onClicked.addListener(function(tab) {});

Причина в том, что у меня есть рабочее расширение, которое слушает в background-script(addListener выше) и выполняет несколько скриптов при нажатии:

chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(tab.id, {file: 'abc.js'});
chrome.tabs.executeScript(tab.id, {file: 'xxx.js'});
});

А теперь я хочу вызвать это "onClicked" из контекстного меню:

var myContextPage = chrome.contextMenus.create({"title": myTitle, "contexts":["page"],
                                     "onclick": fctContext});

Итак, я подумал, что самым простым способом было бы иметь «щелчок» в fctContext.Может быть, есть лучший способ, но я не знаю, как решить мою проблему.Я также пытался запустить "executeScript", но это тоже не работает.

Заранее спасибо!

// Обновление

Решение из ответов: Это решение работает:

//Shared code. When the argument length is two, it is coming from the context
// menu, while a single argument is coming from the browser action.
function fctContext() {
   var tab = arguments.length == 2 ? arguments[1] : arguments[0];
   // Do whatever you want with the tab.
}

// Browser Action
chrome.browserAction.onClicked.addListener(fctContext);

// Context Menu
chrome.contextMenus.create({
   title: myTitle,
   contexts: ['page'],
   onclick: fctContext
});

Решение после тестирования некоторых других вещей:

function fctStart() {
  chrome.tabs.getSelected(null, function(tab){ 
    chrome.tabs.executeScript(tab.id, {file: 'abc.js'});
    chrome.tabs.executeScript(tab.id, {file: 'xxx.js'});
  }); 
}

Вв этом случае fctStart() работает из любой точки без необходимости прохода по вкладке.

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

В вашем конкретном примере вам не нужно передавать tab.id, так как это все равно будет по умолчанию на текущей странице:

function fctContext() {
    chrome.tabs.executeScript(null, {file: 'abc.js'});
    chrome.tabs.executeScript(null, {file: 'xxx.js'});
}

Если вам нужна вкладка, то:

function fctContext(tab) {
    chrome.tabs.executeScript(tab.id, {file: 'abc.js'});
    chrome.tabs.executeScript(tab.id, {file: 'xxx.js'});
}

chrome.browserAction.onClicked.addListener(fctContext);

chrome.contextMenus.create({"title": myTitle, "contexts":["page"], "onclick": function(info, tab) {
    fctContext(tab);
}});
2 голосов
/ 28 июня 2011

Помните, что аргументы необязательны в JavaScript.Каждая функция имеет связанный объект arguments.Этот аргумент действует как массив.В вашем случае, один из них требует этого, а другой нет.Наличие N аргументов в одной функции (действие браузера) одинаково с наличием M аргументов в другой (контекстное меню), единственное различие между этими двумя аргументами заключается в arguments.callee, который обеспечивает способ ссылки на фактический код в самой функции,Вам не нужно беспокоиться об этом, если вы хотите что-то базовое.

Ваш fctContext может быть кодом для совместного использования между вашим щелчком в браузере и действием в контекстном меню.Я проделал нечто подобное в расширении Обновить все вкладки.

Поиск this.reload в https://github.com/mohamedmansour/reload-all-tabs-extension/blob/master/js/reload_controller.js,, вы заметите, что this.reload используется для контекстного меню и действия браузера.Вы просто делитесь кодом.

ОБНОВЛЕНО примером аргументов, запеченным в:

В вашем случае вы делаете то же самое.

// Shared code. When the argument length is two, it is coming from the context
// menu, while a single argument is coming from the browser action.
function fctContext() {
   var tab = arguments.length == 2 ? arguments[1] : arguments[0];
   // Do whatever you want with the tab.
}

// Browser Action
chrome.browserAction.onClicked.addListener(fctContext);

// Context Menu
chrome.contextMenus.create({
   title: myTitle,
   contexts: ['page'],
   onclick: fctContext
});

Проблема с вышеупомянутым подходом - ремонтопригодность, если API изменяет его, он может сломаться.Лично я бы предпочел явно назвать аргументы.Поэтому пользователю не нужно искать в массиве arguments.

function fctContext(tab) {
   // Do whatever you want with the tab.
}

// Browser Action
chrome.browserAction.onClicked.addListener(fctContext);

// Context Menu
chrome.contextMenus.create({
   title: myTitle,
   contexts: ['page'],
   onclick: function (detail, tab) { fctContext(tab) }
});

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...