2010-08-12 11 views
8

मैं एक Firefox विस्तार विकसित कर रहा हूँ और निम्नलिखित कोड है:.onload Firefox विस्तार से कई बार कहा जाता

function initialize() { 
    // For accessing browser window from sidebar code. 
    var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIWebNavigation) 
       .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
       .rootTreeItem 
       .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIDOMWindow); 
    var gBrowser = mainWindow.gBrowser; 
    gBrowser.onload = function() { 
     alert('loaded'); 
    }; 
} 
  1. जब मैं विस्तार (एक साइडबार) खोलने के लिए और भीतर एक नया टैब खोलने के लिए आगे बढ़ें फ़ायरफ़ॉक्स विंडो, तीन अलर्ट बॉक्स हैं।
  2. जब मैं एक पृष्ठ रीफ्रेश करता हूं, तो दो अलर्ट बॉक्स हैं।
  3. जब कोई पृष्ठ लोड हो जाता है, तो केवल एक चेतावनी बॉक्स होता है।
  4. जब मैं टैब बदलता हूं, तो एक चेतावनी निकाल दी जाती है।

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

कोई भी विचार क्यों कि कई घटनाएं ट्रिगर की जा रही हैं (और उन चीजों के लिए जिनके लिए ईवेंट ट्रिगर नहीं किया जाना चाहिए)?

function initialize() { 
    // For accessing browser window from sidebar code. 
    var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIWebNavigation) 
       .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
       .rootTreeItem 
       .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIDOMWindow); 
    var gBrowser = mainWindow.gBrowser; 
    if (gBrowser.addEventListener) { 
     gBrowser.addEventListener("load",pageLoaded,true); 
    }  
} 

function pageLoaded(aEvent) { 
    if ((aEvent.originalTarget.nodeName == '#document') && 
     (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) 
    { 
     alert('loaded'); 
    } 
} 
  1. aEvent.originalTarget.nodeName == '#document' की जाँच करता है कि पृष्ठ लोड होता है:

    समाधान

    MatrixFrog के सुझाव से के बाद, यहाँ समाधान मैं के लिए आया था है और फेविकॉन नहीं।

  2. (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) की जाँच करता है कि तत्व यह है कि गतिविधि सक्रिय टैब में पृष्ठ है, और नहीं अपने iframes में से एक
  3. gBrowser.onload होगा केवल xul-image के लिए आग और # दस्तावेज़ के लिए नहीं, इसलिए इसे gBrowser.addEventListener ("load", pageLoaded, true) के साथ प्रतिस्थापित किया गया था; !
  4. आप नए खाली टैब के लिए घटना फायरिंग से बचने के लिए, सुनिश्चित करें कि gBrowser.currentURI.spec बनाने चाहते हैं = "about: blank"
+1

प्रस्तावित समाधान संभाल नहीं सकता है जब पेज अलग-अलग फ़ायरफ़ॉक्स टैब पर लोड होते हैं, केवल एक टैब (केंद्रित टैब) के लिए बीकोज़ की स्थिति AEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec का मूल्यांकन वास्तविक –

उत्तर

6

से https://developer.mozilla.org/en/Code_snippets/On_page_load

वर्तमान फ़ायरफ़ॉक्स ट्रंक नाइटलीज़ न केवल दस्तावेज़ों के लिए ऑन पेज लोड फ़ंक्शन को आग लगेंगे, लेकिन xul:image एस (टैबब्रोसर में फेविकॉन)। आप केवल दस्तावेजों को संभालने के लिए चाहते हैं, तो सुनिश्चित aEvent.originalTarget.nodeName == "#document"

आप अभी भी दिखाई दे रही है बाह्य 'लोड' घटनाओं फायरिंग, आप घटना लक्ष्य का निरीक्षण करने के क्या लोड किया जा रहा है यह पता लगाने कर सकते हैं, और उपयोग कुछ विशिष्ट मामलों में अपने एक्सटेंशन के तर्क को कॉल करने से बचने के लिए समान तर्क।

+0

के रूप में किया जाएगा बहुत कम आग लगती है, लेकिन कुछ पृष्ठों पर अभी भी कई बार काम करती है। मुझे लगता है कि यह एक अधिभार घटना फायरिंग iframes के कारण है? बस दस्तावेज़ के लोड से आईफ्रेम लोड को अलग करने के तरीके को देखते हुए और पृष्ठ और उसके सभी आइफ्रेम लोड होने पर कैप्चरिंग की जा रही है या नहीं। – Ivan

+2

@Ivan, yup यह शायद iframes है। यदि यह एक आईफ्रेम नहीं है तो 'event.originalTarget.defaultView.frameElement' शून्य/अपरिभाषित होगा। – MatrixFrog

+1

@MatrixFrog क्या इसे जांचने का कोई और तरीका है? –

संबंधित मुद्दे