JavaScript: <body onload = ""> и window.onload - PullRequest
3 голосов
/ 12 января 2012

Сегодня я столкнулся со странной ошибкой. У меня был простой пользовательский скрипт, который добавлял событие window.onload ко всем сайтам. Но на одном из сайтов было определено <body onload="func();">. Случилось так, что window.onload работал как обычно, но <body onload=""> перестал работать на сайте после установки usercript.

Когда я использовал window.body.onload, вместо этого оба работали хорошо. Я знаю, что window.onload и <body onload=""> - это разные способы сделать то же самое, но то, что происходит в window.body.onload, что делает его хорошо работающим с <body onload="">?

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Window.onload и загрузка тега body - это одно и то же событие . Таким образом, если вы устанавливаете одно и то же событие дважды двумя разными методами, оно заканчивается только одним значением - одной из функций.

window.body.onload - это отдельное событие. Просто еще одна причуда DoM и то, что с ней делают.

1 голос
/ 12 января 2012

Как сказал Myforwik, событие, которое вы подключаете с помощью window.onload = ...;, является тем же событием, с которым вы подключаетесь <body onload="...">. Это событие window load. Оба эти способа подключены к старому стилю DOM0, который давно устарел. Если вы укажете оба, последний выиграет, нокаутируя первый. То же самое верно, если несколько сценариев устанавливают window.onload независимо.

Чтобы избежать подобных проблем, используйте перехват событий в стиле DOM2:

if (window.addEventListener) {
    // DOM2 standard
    window.addEventListener("load", handler, false);
}
else if (window.attachEvent) {
    // Microsoft's precursor to it, IE8 and earlier
    window.attachEvent("onload", handler);
}
else {
    // Some pre-1999 browser
    window.onload = handler;
}

function handler() {
}

Несколько обработчиков DOM2 могут быть присоединены к одному и тому же событию, поэтому на него могут подписаться несколько несвязанных сценариев. Кроме того, обработчики DOM2 успешно сосуществуют с обработчиками DOM0.

Таким образом, если вы обновите свой пользовательский скрипт, чтобы использовать вышеуказанное, страница <body onload="..."> не будет затронута.

...