Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用函数单击触发器chrome.browserAction.onclick_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript 使用函数单击触发器chrome.browserAction.onclick

Javascript 使用函数单击触发器chrome.browserAction.onclick,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我想触发单击,以下代码正在侦听该单击: chrome.browserAction.onClicked.addListener(函数(选项卡){}) 原因是我有一个工作扩展,它正在后台脚本(上面的addListener)中侦听,并在单击时执行一些脚本: chrome.browserAction.onClicked.addListener(function(tab) { chrome.tabs.executeScript(tab.id, {file: 'abc.js'}); chrome.tabs.

我想触发单击,以下代码正在侦听该单击:

chrome.browserAction.onClicked.addListener(函数(选项卡){})

原因是我有一个工作扩展,它正在后台脚本(上面的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()
从任何一点开始工作,而无需通过选项卡。

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

您的
fctContext
可以是您的浏览操作单击和上下文菜单之间的可共享代码。我在“重新加载所有选项卡”扩展中做了类似的操作

在中搜索
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) }
});

希望有帮助

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

我建议将效果与触发器分开。例如,创建一个
函数do_something(){}
,并将其粘贴到扩展中,以便该行为是一个完全不同的函数,只需单击即可通知并触发。然后你可以重复使用
dou_something()在任何需要的地方使用,而不是将其绑定到chrome事件。感谢您的评论/想法。这是我已经尝试过的东西。问题是,我不知道如何准确地获取正确的“tab”,这是addListener中当前函数的参数,在
chrome.browserAction.onClicked.addListener
之外,我已经合并了您的帐户。您现在可以评论答案、编辑问题或接受帮助您的答案:)谢谢注册。很遗憾,我无法合并您留下的答案,引用了这么多人,对此表示抱歉。感谢您合并帐户!好的,谢谢。我通过可选参数了解这一点。我认为我的问题是,chrome.tabs.executeScript需要正确的tab.id。执行的脚本必须在内容中执行,当我在没有tab.id的情况下执行它时,它将在后台执行。你知道我的意思吗?是的,我明白。在这种情况下,您可以使用arguments关键字,正如我在文章中解释的那样。我已经更新了帖子,告诉你怎么做。希望有帮助!完美的正是我需要的。谢谢!感谢您的回答,但在这种特殊情况下,我需要tab.id,因为使用executeScript执行的.js必须在内容中执行,并且调用是在后台执行的。Daniel,正如serg所述,id默认为当前窗口中选中的选项卡,用于
chrome.tabs.executeScript
,因此它也可以工作:)