Контекст: я пытаюсь программно определить (с помощью внедренного скрипта), имеет ли произвольная страница (не закодированная мной) набор функций window.onload
(с помощью window.onload=foo
, а не addEventListener
).
Я думал, что могу просто проверить, есть ли typeof window.onload === "function"
, но это верно для этого случая:
<script>
function onload() {
console.info('onload called'); // this is *not* triggered on page load
}
typeof window.onload === "function"; // is true
window.onload === onload; // is`true`
window.hasOwnProperty("onload"); // is`true`
</script>
И все же эта функция не вызывается автоматически во время загрузки страницы. Я тестировал последние версии Chrome и Firefox.
Я думал, что это будет эквивалентно этому:
<script>
window.onload = function() {
console.info('onload called'); // this *is* triggered on page load
};
</script>
Но, похоже, это не так. Похоже, что в браузере есть установщик (или что-то в этом роде), который срабатывает при явном назначении window.onload
, в отличие от случая, когда глобальная переменная неявно доступна через объект окна.
Как я могу надежно определить (с помощью внедренного скрипта), имеет ли произвольная страница фактический набор window.onload
(я имею в виду тот, который срабатывает при загрузке страницы), а не только, например. глобальная функция под названием onload
?
Вам следует использовать событие DOMContentLoaded
-> Developer.mozilla.org/en-US/docs/Web/API/Window/load_event -> stackoverflow.com/questions/2414750/…
Люди, пожалуйста, прочитайте вопрос внимательнее и удалите или объясните закрытое голосование. Я явно не спрашиваю, какое событие лучше всего использовать. Как я сказал в начале и повторил в конце: как я могу надежно определить, имеет ли произвольная страница фактический набор window.onload
(я имею в виду тот, который срабатывает при загрузке страницы), а не только, например, глобальная функция под названием onload
? Я постараюсь внести уточняющую правку, но не уверен, как можно внести здесь более ясную информацию.
@joe, твой вопрос был для меня кристально ясен с первого раза, когда я его прочитал
document.body.onload
— это псевдоним window.onload
.
Итак, должно выйти следующее false
function onload() {
console.info('does not fire on load');
}
console.info(window.onload === document.body.onload)
В то время как при использовании window.onload =
должно выводиться следующее true
(а также console.info в обработчике onload
window.onload = function onload() {
console.info('does fire on load');
}
console.info(window.onload === document.body.onload)
Легендарный. Это работает (проверено в Firefox и Chrome). Спасибо!
Вы сказали: «И все же эта функция не вызывается автоматически во время загрузки страницы». Это потому, что эта функция НЕ находится под
window
. Могу поспорить, вы получите тот же результат, если полностью удалите этот блок. В этом случае вы просто обнаруживаете какую-то функциюwindow.onload()
по умолчанию, которая по своей сути является частью страницы (и она просто заменяется, когда вы создаете свою собственную). Я бы проверил, что происходит, используя другие браузеры.