2012-01-12 2 views
3

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

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

+1

Я испытал на IE7, 8, 9. – vikmalhotra

ответ

1

Как сказал Myforwik, мероприятие, связанное с window.onload = ...;, - это то же самое событие, которое вы подключаете с помощью <body onload="...">. Это событие windowload. Оба способа подключения - это старый стиль 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="..."> не будет затронута.

+0

http://jsfiddle.net/fe6jL/5/ - при запуске скрипта отображается только одно предупреждение. – vikmalhotra

+2

@ShiVik: Опять же, jsFiddle переносит весь ваш скрипт в обработчик 'onload' (смотрите выпадающие списки слева), что, очевидно, означает, что к моменту запуска вашего скрипта это событие уже произошло. Вам нужно выбрать одну из опций «no wrap» из раскрывающегося списка или для инструмента, который скрывает от вас меньше, используйте http://jsbin.com. Кроме того, при использовании 'addEventListener' обратите внимание на то, как вы используете строку' 'load '', ** not ** '" onload "', как вы это делаете с 'attachEvent' (см. Мой пример выше, вы изменили его в своей скрипке) , И, избегайте 'alert' для событий, связанных с событиями. Рабочий пример: http://jsbin.com/agubat –

2

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

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

+0

я тестировал здесь http://jsfiddle.net/fe6jL/1/ и кажется, что 'window.body.onload' получить срабатывает после того, как' ' – vikmalhotra

+0

' @Myforwik ': Я никогда не слышал о' window.body.onload', и ни IE (проверены 6 и 9), ни Chrome, ни Firefox, ни Opera, похоже, не запускали его: http://jsbin.com/ojibeq Вы имели в виду 'document. body.onload'? Если это так, насколько я могу судить, это то же самое, что и 'window.onload' (по крайней мере, когда вы используете обработчики DOM0): http://jsbin.com/izalik –

+0

@ShiVik: у вашего теста есть ошибка, не в последнюю очередь потому что jsfiddle обертывает вещи для вас. Код 'window.body.onload = alert (" hello "); ** вызывает **' alert ("hello") 'и присваивает свое ** возвращаемое значение ** в' window.body.onload'. Попробуйте следующее: http://jsbin.com/izalik –

Смежные вопросы