Chrome extension script загружается дважды на некоторых страницах
это мой файл 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"});
}
});
В contentcript.js я просто запускаю всплывающее окно.
$(document).ready(function () {
function popup() {...}
if (window.addEventListener)
{
window.addEventListener('load', popup(), false);
}
else if (window.attachEvent)
{
window.attachEvent('onload', popup());
}
});
Есть несколько страниц, в которых есть одно всплывающее окно, и есть страницы с двумя или даже более
В чем проблема?
============= EDIT ==================
эти страницы содержат Iframes
Ответы
Ответ 1
chrome.tabs.onUpdated.addListener
запускается при изменении состояния табуляции, это не имеет никакого отношения к iframes. Ваш script вводится несколько раз в один и тот же фрейм, потому что вы вводите его для каждого изменения состояния, и вы хотите вставлять его только тогда, когда статус изменяется на "завершен". Измените свой код, добавив if (changeInfo.status == "complete") {
:
chrome.tabs.onUpdated.addListener(function(tabId,info, tab) {
if (info.status == "complete") {
/* checking & injecting stuff */
}
});
Ответ 2
Я не уверен, почему сценарии контента загружаются дважды. Но у меня тоже была эта проблема. Я добавил следующее в элемент "content_scripts" в manifest.json, и он работал нормально.
"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"
]
}
Ответ 3
Вы можете управлять контентом script с помощью файла манифеста расширения:
Вы можете запретить загрузку содержимого script в iframe или определенный набор URL-адресов.
Вот пример манифеста:
"all_frames": true,
"js": [ "ContentOnDocStart.js" ],
"matches": [ "http://*/*", "https://*/*" ],
"exclude_matches": [ ],
"run_at": "document_start"
Ответ 4
Скорее всего, это вызвано страницами, использующими фреймы. script загружается для каждого кадра. Возможно, вы сможете обнаружить, в какой кадр вы загружались, или один фрейм уже имеет ваш script, если вы абсолютно хотите выполнить свой script только один раз.