Я разрабатываю расширение 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 не закончит загрузку на странице, прежде чем я запустит мой.
Любые идеи относительно того, почему срабатывает несколько событий (и для вещей, для которых событие не должно запускаться)?
РЕШЕНИЕ
Исходя из предположения 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)) проверяет, что элемент, который уволил событие страница на вкладке, а не один из его ссылок IFRAME
- gBrowser.onload бы только огонь для xul-image, а не для #document, поэтому он был заменен на gBrowser.addEventListener («load», pageLoaded, true); !
- Если вы хотите, чтобы избежать стрельбы событие для новых пустых вкладок, убедитесь, что gBrowser.currentURI.spec = "о: пустой"
Предлагаемое решение не может обрабатывать, когда страницы загружаются на разных вкладках firefox beacause только для одной вкладки (сфокусированная вкладка) условие aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec будет оцениваться как истинный –