我有一个chrome扩展名,说它将内容脚本a.js注入到匹配“http://example.com/ *”的网址中。然后,当我单击example.com页面中的某些页面元素时,a.js会要求后台创建一个带有已定义url的新选项卡,并以编程方式将内容脚本b.js注入新选项卡,您可以检查代码: / p>
chrome.tabs.create({
url: 'http://example.com'
}, function (tab) {
var taskTab = tab.id;
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
if (tabId === taskTab) {
chrome.tabs.executeScript(taskTab, {
file: 'scripts/b.js'
});
}
});
});
问题是,内容脚本b.js会被注入新标签很多次。我也尝试了chrome.webNavigation
,结果是一样的。
所以,如果我想将b.js只注入新标签一次?我该怎么做?
顺便说一句,b.js实际上是一个远程文件,我把它加载到jQuery页面,这里简化了我把它变成本地文件的问题。
非常感谢。
我弄清楚我的代码发生了什么。
首先,我将onUpdated
事件监听器包装在create
回调中是错误的,每次创建新选项卡,关闭它,再次创建它,事件监听器都会绑定一个更多时间。越多越多。
其次,@ Xan是对的,我可以通过检查changeInfo.status
来做到这一点。所以代码是:
var taskTab;
chrome.tabs.create({
url: 'http://example.com'
}, function (tab) {
taskTab = tab.id;
});
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
if (changeInfo.status === 'complete'){
if (tabId === taskTab) {
chrome.tabs.executeScript(taskTab, {
file: 'scripts/b.js'
});
}
}
});
b.js只会被注入一次,无论是本地文件还是jQuery加载的远程文件。
答案 0 :(得分:1)
onUpdated
事件可能会因为很多原因而触发:
object changeInfo
:列出对已更新的选项卡状态的更改。
string (optional) status
:标签的状态。可以加载也可以完成。
string (optional) url
:标签的网址(如果已更改)。
boolean (optional) pinned
:标签的新固定状态。
string (optional) favIconUrl
:标签的新favicon网址。
您可能希望按onUpdated
changeInfo
个事件
故障安全方法:当您注入第二个脚本时,请在执行脚本的其余部分之前设置一些为undefined
检查的保护变量。注入脚本的任何其他尝试都将在相同的上下文中,并将看到变量集。有点像C #ifndef
包括。