chrome扩展脚本在某些页面上加载了两次甚至更多

时间:2012-10-30 22:44:53

标签: javascript google-chrome-extension

这是我的background.js文件

 chrome.tabs.onUpdated.addListener(function(tabId,info, tab) {
    var sites =new Array('site2','site1');
    var url=tab.url;
    var siteFlag=0;
    for(var i in sites) {
       var regexp = new RegExp('.*' + sites[i] + '.*','i');
       if (regexp.test(url)) {siteFlag=1;}
    };
    if(siteFlag==1){
      chrome.tabs.executeScript(tabId, {file:"contentscript.js"});
      chrome.tabs.executeScript(tabId, {file:"jquery.js"});
      chrome.tabs.insertCSS(tabId,{file:"box.css"});
    }
 });

在contentscript.js中,我只需运行一个弹出框。

$(document).ready(function () {
    function popup() {...}
    if (window.addEventListener)
    {
        window.addEventListener('load', popup(), false); 
    } 
    else if (window.attachEvent)
    {
        window.attachEvent('onload', popup());
    }
});

有些页面有一个弹出框,有两个或更多的页面

有什么问题?

============= EDIT ==================

这些网页包含iframe

4 个答案:

答案 0 :(得分:9)

选项卡状态更改时会触发

chrome.tabs.onUpdated.addListener,这与iframe无关。您的脚本会多次注入同一帧,因为您为每次状态更改注入了它,并且只有在状态更改为“complete”时才要注入它。通过添加if (changeInfo.status == "complete") {修改您的代码:

chrome.tabs.onUpdated.addListener(function(tabId,info, tab) {
   if (info.status == "complete") {
      /* checking & injecting stuff */
   }
});

答案 1 :(得分:7)

我不确定内容脚本加载两次的原因。但我也有这个问题。我将以下内容添加到manifest.json中的“content_scripts”元素中,它运行得很好。

"content_scripts" : [
    {
        "all_frames" : false,
        "run_at" : "document_end",
    }
]

最后,manifest.json:

{
    "name": "ABC",
    "version": "0.0.0.1",
    "manifest_version": 2,
    "key": "longkeyhere",
    "description": "Description",
    "minimum_chrome_version": "29",
    "background": {
        "scripts": [
            "jquery.js",
            "jquery.min.js",
        ]
    },
    "content_scripts" : [
        {
            "all_frames" : false,
            "run_at" : "document_end",
            "matches" : [ "http://*/*" ],
            "js" : [
                "jquery.js",
                "jquery.min.js",
            ]
        }
    ],
    "options_page": "options.html",
    "permissions": [
        "http://*/*",
        "https://*/*",
        "contextMenus",
        "tabs",
        "identity",
        "storage"
    ]
}

答案 2 :(得分:1)

您可以使用扩展程序的清单文件控制内容脚本执行: 您可以阻止将内容脚本加载到iframe或一组特定网址中。 以下是示例清单部分:

"all_frames": true,
 "js": [ "ContentOnDocStart.js" ],
 "matches": [ "http://*/*", "https://*/*" ],
 "exclude_matches": [ ],
 "run_at": "document_start"

答案 3 :(得分:0)

这很可能是由使用框架的网页引起的。为每个帧加载脚本。如果您只想执行一次脚本,则可能能够检测到您在哪个帧中加载,或者一个帧是否已经包含您的脚本。