使用函数触发chrome.browserAction.onClicked

时间:2011-06-27 22:04:27

标签: javascript google-chrome google-chrome-extension

我想触发以下代码正在侦听的点击:

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

原因是我有一个工作扩展,它在后台脚本(上面的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 个答案:

答案 0 :(得分:3)

在您的特定示例中,您无需传递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);
}});

答案 1 :(得分:2)

请记住,参数在JavaScript中是可选的。每个函数都有一个关联的arguments对象。这些参数充当数组。在你的情况下,其中一个需要,而另一个则不需要。在一个函数(浏览器操作)中,N个参数与在另一个函数(上下文菜单)中具有M个参数相同,这两个参数之间的唯一区别是arguments.callee,它提供了一种引用实际代码的方法。功能本身。如果你想要一些基本的东西,你不必担心。

您的fctContext可能是您的browserAction点击和上下文菜单之间的可共享代码。我在Reload All Tabs扩展中做了类似的事情。

https://github.com/mohamedmansour/reload-all-tabs-extension/blob/master/js/reload_controller.js中搜索this.reload,您会注意到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) }
});

希望有所帮助!