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
,因此它也可以工作:)