我正在開發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');
};
}
- 當我打開擴展(側邊欄),並着手中打開一個新標籤Firefox窗口,有三個警報框。
- 當我刷新頁面時,有兩個警報框。
- 當頁面加載完成時,只有一個警告框。
- 當我更改選項卡時,會觸發警報。
我使用.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');
}
}
- aEvent.originalTarget.nodeName == '#document' 檢查該頁面加載而不是小圖標。
- (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec))檢查引發該事件的元素是在標籤的頁面,而不是它的I幀的一個
- gBrowser.onload會只爲xul-image啓動,而不是爲了#document,所以它被替換爲gBrowser.addEventListener(「load」,pageLoaded,true); !
- 如果你想避免火燒新的空白標籤的情況下,確保gBrowser.currentURI.spec = 「有關:空白」
建議的解決方案無法處理頁面加載在不同的Firefox選項卡,因爲只有一個選項卡(焦點選項卡)條件aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec將評估爲true – 2011-10-01 16:28:11