Я занимаюсь разработкой расширения 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! = "About: blank"