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