2010-08-12 64 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. 當我打開擴展(側邊欄),並着手中打開一個新標籤Firefox窗口,有三個警報框。
  2. 當我刷新頁面時,有兩個警報框。
  3. 當頁面加載完成時,只有一個警告框。
  4. 當我更改選項卡時,會觸發警報。

我使用.onload而不是DOMContentLoaded或readystatechange,因爲我需要等到所有其他JavaScript已完成在頁面上加載之前我運行我的。

對於爲什麼會觸發多個事件(以及事件不應觸發)的任何想法?

SOLUTION

從MatrixFrog的建議之後,這裏是我來解決:

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' 檢查該頁面加載而不是小圖標。
  2. (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec))檢查引發該事件的元素是在標籤的頁面,而不是它的I幀的一個
  3. gBrowser.onload會只爲xul-image啓動,而不是爲了#document,所以它被替換爲gBrowser.addEventListener(「load」,pageLoaded,true); !
  4. 如果你想避免火燒新的空白標籤的情況下,確保gBrowser.currentURI.spec = 「有關:空白」
+1

建議的解決方案無法處理頁面加載在不同的Firefox選項卡,因爲只有一個選項卡(焦點選項卡)條件aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec將評估爲true – 2011-10-01 16:28:11

回答

6

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

當前的Firefox樹幹睡房不僅會爲文檔啓動onPageLoad函數,還會啓動xul:image(tabbrowser中的圖標)。如果你只是想處理的文件,確保aEvent.originalTarget.nodeName == "#document"

如果你看到的仍然是多餘的「負荷」事件射擊,你可能要檢查事件目標弄清楚真實加載的東西,和使用類似的邏輯,以避免在某些特定情況下調用您的擴展的邏輯。

+0

它火力減少很多,但仍然在一些頁面上進行多次。我猜這是由於iframe發起onload事件? 只是研究如何分辨文檔負載中的iframe負載,以及是否在頁面及其所有iframe加載時捕獲iframe。 – Ivan 2010-08-13 17:23:23

+2

@伊萬,可能是iframe。如果它不是一個iframe,那麼'event.originalTarget.defaultView.frameElement'將爲空/未定義。 – MatrixFrog 2011-02-09 15:51:01

+1

@MatrixFrog是否有另一種方法來檢查它? – 2013-07-12 07:23:33