2012-10-30 10 views
10

questo è il mio file background.jssceneggiatura estensione Chrome sta caricando due volte ancora di più su alcune pagine

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"}); 
    } 
}); 

Negli contentscript.js ho semplicemente eseguito un finestra popup.

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

Ci sono alcune pagine che ci sono un pop-up-box e ci sono pagine che due o anche più

qual è il problema?

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

quelle pagine contengono iframe

+0

possibile duplicato del [Chrome Extension - Content Scrittura viene iniettato più volte per carico singola pagina] (http://stackoverflow.com/questions/7829895/chrome-extension-content-script-being-injected-multiple-times-per-single-page) –

risposta

9

chrome.tabs.onUpdated.addListener viene generato quando lo stato della scheda cambia, questo non ha nulla a che fare con iframe. Lo script viene iniettato più volte sullo stesso frame perché lo si inietta per ciascuna modifica di stato e si desidera iniettarlo solo quando lo stato cambia in "completa". Modificare il codice con l'aggiunta di if (changeInfo.status == "complete") {:

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

Woooaaahh. Sto usando if (tabs ['status']! = 'Complete') {return;} e questo ha causato il mio script di eseguire più volte ogni aggiornamento. Passare all'utilizzo di changeInfo.status ha fermato completamente questo! 48 ore della mia vita sparite !! – ZAR

0

Molto probabilmente questo è causato dalle pagine che usano i frame. Lo script viene caricato per ogni frame. Potresti essere in grado di rilevare in quale frame sei caricato, o se un frame ha già il tuo script se vuoi assolutamente eseguire il tuo script solo una volta.

1

è possibile controllare il l'esecuzione dello script contenuti utilizzando file manifesto del proprio interno: È possibile impedire lo script contenuti da caricare in iframe o un insieme specifico di URL. Ecco una sezione manifesto del campione:

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

io non sono sicuro perché gli script contenuti caricati due volte. Ma ho avuto anche questo problema. Ho aggiunto quanto segue all'elemento "content_scripts" in manifest.json e ha funzionato bene.

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

Così alla fine, 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" 
    ] 
} 
Problemi correlati