Доступ к объекту окна в сценарии содержимого надстройки Firefox?

Кажется, я не могу получить доступ к объекту окна в сценарии содержимого. Это нормально?

Например, это ничего не делает:

window.onload = function() {
  console.log("Hello from the onload");
};

Вместо этого я должен использовать объект unsafeWindow.

unsafeWindow.onload = function() {
  console.log("Hello from the onload");
};

Я должен упустить что-то простое, верно?


person David Tuite    schedule 30.08.2012    source источник


Ответы (2)


Не используйте window.onload, вместо этого напишите:

window.addEventListener("load", function() {
  console.log("Hello from the onload");
}, false);

window.onload имеет ограничение, заключающееся в том, что может быть только один прослушиватель событий, установка другого прослушивателя заменяет существующий - это уже причина, по которой вам никогда не следует его использовать. В случае Add-on SDK все усложняется, потому что сценарий содержимого имеет другое представление DOM, чем веб-страница. Поэтому просто используйте addEventListener.

О, и, пожалуйста, не используйте unsafeWindow - это (как уже понятно из названия) небезопасно по своей сути.

person Wladimir Palant    schedule 31.08.2012

Объект окна, доступный вам в сценарии содержимого, на самом деле является прокси-сервером, поэтому unsafeWindow работает, а окно — нет. Я сделал несколько тестов, и document.addEventListener тоже не работает:

https://builder.addons.mozilla.org/package/150362/latest/

jQuery, кажется, работает нормально, я полагаю, что есть какая-то магия, которую они делают, чтобы гарантировать, что они сработают, несмотря ни на что.

Обходной путь заключается в том, чтобы просто установить для contentScriptWhen значение «end» и немедленно запустить код — это всегда должно работать, поскольку сценарий содержимого прикрепляется после завершения загрузки документа.

Я зарегистрировал эту ошибку в отношении того, что мне нравится думать как «wtf?» аспект этого поведения - я думаю, что результат удивит веб-разработчиков, и мы должны попытаться быть менее неожиданными:

https://bugzilla.mozilla.org/show_bug.cgi?id=787063

person therealjeffg    schedule 30.08.2012
comment
К сожалению, есть связанная проблема. Доступ к window.onbeforeunload или window.onunload также недоступен, а $(window).bind('onbeforeunload', fn) не работает. Насколько я могу судить, нет обходных путей для вызова функции onunload или onbeforeunload из скриптов содержимого. Это то, что мне действительно нужно уметь делать, я немного упростил свой вопрос, чтобы он был коротким (дох!). - person David Tuite; 30.08.2012
comment
Я могу задать новый SO-вопрос, отправить отчет об ошибке Moz, привести пример и т. д. Все, что вам нужно. - person David Tuite; 30.08.2012
comment
Конечно document.addEventListener не работает - это window.addEventListener. - person Wladimir Palant; 31.08.2012