`function onload(){}` — это не то же самое, что `window.onload=function(){}` — первая не срабатывает при загрузке страницы. Почему?

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

Вы сказали: «И все же эта функция не вызывается автоматически во время загрузки страницы». Это потому, что эта функция НЕ находится под window. Могу поспорить, вы получите тот же результат, если полностью удалите этот блок. В этом случае вы просто обнаруживаете какую-то функцию window.onload() по умолчанию, которая по своей сути является частью страницы (и она просто заменяется, когда вы создаете свою собственную). Я бы проверил, что происходит, используя другие браузеры.

Diego Ferruchelli 24.08.2024 01:54

Вам следует использовать событие DOMContentLoaded -> Developer.mozilla.org/en-US/docs/Web/API/Window/load_event -> stackoverflow.com/questions/2414750/…

Mister Jojo 24.08.2024 02:42

Люди, пожалуйста, прочитайте вопрос внимательнее и удалите или объясните закрытое голосование. Я явно не спрашиваю, какое событие лучше всего использовать. Как я сказал в начале и повторил в конце: как я могу надежно определить, имеет ли произвольная страница фактический набор window.onload (я имею в виду тот, который срабатывает при загрузке страницы), а не только, например, глобальная функция под названием onload? Я постараюсь внести уточняющую правку, но не уверен, как можно внести здесь более ясную информацию.

joe 24.08.2024 03:52

@joe, твой вопрос был для меня кристально ясен с первого раза, когда я его прочитал

Jaromanda X 24.08.2024 04:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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). Спасибо!

joe 24.08.2024 03:57

Другие вопросы по теме