2012-10-30 13 views
10

पर भी अधिक दो बार लोड कर रहा है यह मेरा 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()); 
    } 
}); 

एक पॉपअप बॉक्स देखते हैं और पृष्ठों देखते हैं कि कुछ पृष्ठ नहीं है कि दो या इससे भी ज्यादा

समस्या क्या है?

============= संपादित ==================

उन पृष्ठों Iframes

+0

के संभावित डुप्लिकेट [क्रोम एक्सटेंशन - कई बार इंजेक्शन की जा रही सामग्री स्क्रिप्ट के प्रति एक पृष्ठ लोड] (http://stackoverflow.com/questions/78298 9 5/क्रोम-एक्सटेंशन-कंटेंट-स्क्रिप्ट-इंजेक्शन-एकाधिक-बार-प्रति-एकल-पृष्ठ) –

उत्तर

9

chrome.tabs.onUpdated.addListener टैब स्थिति में परिवर्तन होने पर निकाल दिया जाता है, इसका आईफ़्रेम के साथ कुछ लेना देना नहीं है। आपकी स्क्रिप्ट को एक ही फ्रेम में कई बार इंजेक्शन दिया जाता है क्योंकि आप इसे प्रत्येक स्थिति में परिवर्तन के लिए इंजेक्ट करते हैं, और जब आप स्थिति को "पूर्ण" में बदलते हैं तो आप इसे इंजेक्ट करना चाहते हैं। if (changeInfo.status == "complete") { जोड़कर अपने कोड को संशोधित करें:

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

वूआआहाह। मैं उपयोग कर रहा हूं अगर (टैब ['स्थिति']! = 'पूर्ण') {वापसी;} और इससे मेरी स्क्रिप्ट प्रत्येक अद्यतन को कई बार चलाने के लिए प्रेरित करती है। ChangeInfo.status का उपयोग करने के लिए स्विचिंग पूरी तरह से इसे रोक दिया! मेरे जीवन के 48 घंटे चले गए !! – ZAR

0

सबसे अधिक संभावना को शामिल यह फ्रेम का उपयोग कर पृष्ठों के कारण होता है। लिपि प्रत्येक फ्रेम के लिए लोड हो जाता है। आप यह पता लगाने में सक्षम हो सकते हैं कि आप किस फ्रेम को लोड कर रहे हैं, या एक फ्रेम में पहले से ही आपकी स्क्रिप्ट है यदि आप पूरी तरह से केवल एक बार अपनी स्क्रिप्ट निष्पादित करना चाहते हैं।

1

आपको अपने विस्तार के मैनिफ़ेस्ट फ़ाइल का उपयोग अपनी सामग्री स्क्रिप्ट निष्पादन को नियंत्रित कर सकते हैं: आप iframes या यूआरएल का एक विशिष्ट सेट में लोड करने से अपनी सामग्री स्क्रिप्ट रोका जा सकता है।

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

मुझे यकीन है कि क्यों सामग्री स्क्रिप्ट दो बार लोड नहीं हूँ: यहाँ एक नमूना प्रकट खंड है। लेकिन मुझे भी यह समस्या थी। मैंने 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" 
    ] 
} 
संबंधित मुद्दे