Контекст: я пытаюсь программно определить (с помощью внедренного скрипта), имеет ли произвольная страница (не закодированная мной) набор функций 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, твой вопрос был для меня кристально ясен с первого раза, когда я его прочитал



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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()по умолчанию, которая по своей сути является частью страницы (и она просто заменяется, когда вы создаете свою собственную). Я бы проверил, что происходит, используя другие браузеры.