Chrome扩展程序-内容脚本在单个页面加载中被注入多次

4

我正在使用Chrome扩展程序,但是遇到了一个问题:我的内容脚本被注入到同一个页面多次。

我是在“background.html”页面上,在选项卡切换时注入内容脚本:

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){ 
    chrome.tabs.getSelected(null,function(tab){
         // Do some stuff
         chrome.tabs.executeScript(null, { code: code}, function(result){

在内容脚本中,我有一些console.log命令。
问题是当我加载单个页面时,我会在控制台中看到每个日志出现2-4次。
我认为这是由于页面中的iframes引起的。我的问题是为什么?
我已经在文档中看到“all_frames”(清单中的内容脚本权限数组)默认应设置为“false”,导致内容脚本仅注入到页面的顶部框架中,但这根本没有发生!
为什么它会被多次注入?我需要物理上将“all_frames”设置为false吗?
其次:
有没有办法告诉扩展程序尝试将内容脚本注入的页面是否为iframe或来自“background.html”页面的顶部?
我已经尝试过
if(window.top === window){ console.log('whatever'); }

我发现这种方法并不总是有效的,即使在整个代码块(chrome.tabs.executeScript()周围)都有条件限制的情况下,我仍然看到内容脚本被多次注入....

如果您有任何想法或建议,将不胜感激! :)


您不必使用chrome.tabs.getSelected(),因为tab对象有一个名为active的属性,它可以让您知道该标签页当前是否被选中。 - thdoan
1个回答

3

onUpdated每当标签页的状态发生改变时都会触发。这包括它正在加载完成加载,这就解释了为什么会有这么多日志记录。

你需要每次事件触发时检查发生了什么变化(URL变化,已经加载等)。

哇,我感觉自己好蠢啊!:) 我的代码中实际上有一个 if(changeInfo.status == "complete" ) {} 条件语句,但是受影响的代码块在它的外面...这就是同时在多个项目和平台/API上工作的后果!:P 谢谢! - delta9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接