В чем конкретно разница между window.onload
событием и onload
событием body
тега? Когда я использую, что и как должно быть сделано правильно?
javascript
Manu
источник
источник
Ответы:
window.onload = myOnloadFunc
и<body onload="myOnloadFunc();">
есть разные способы использования одного и того же события . Использованиеwindow.onload
менее навязчиво - оно убирает ваш JavaScript из HTML.Все распространенные библиотеки JavaScript, Prototype, ExtJS, Dojo, JQuery, YUI и т. Д. Предоставляют удобные оболочки для событий, которые происходят при загрузке документа. Вы можете прослушивать событие окна onLoad и реагировать на него, но onLoad не запускается до тех пор, пока не будут загружены все ресурсы, поэтому ваш обработчик событий не будет выполняться до тех пор, пока не будет получено последнее огромное изображение. В некоторых случаях это именно то, что вам нужно, в других вы можете обнаружить, что прослушивание, когда DOM готов, более уместно - это событие похоже на onLoad, но запускается без ожидания загрузки изображений и т. Д.
источник
myOnloadFunc()
в глобальном контексте (this
будет ссылаться наwindow
). Установка его через javascript заставит его выполняться в контексте элемента (this
относится к элементу, на котором было инициировано событие). В этом конкретном случае это не будет иметь значения, но это будет с другими элементами.this
при желании переопределить объект, на который ссылается.Там нет никакой разницы, но вы также не должны использовать.
Во многих браузерах
window.onload
событие не запускается до тех пор, пока не будут загружены все изображения, а это не то, что вам нужно. В основанных на стандартах браузерах есть событие,DOMContentLoaded
которое вызывается раньше, но не поддерживается IE (на момент написания этого ответа). Я бы рекомендовал использовать библиотеку javascript, которая поддерживает кросс-браузерную функцию DOMContentLoaded, или найти хорошо написанную функцию, которую вы можете использовать. JQuery$(document).ready()
, хороший пример.источник
window.onload
может работать без тела. Создайте страницу только с тегами скрипта и откройте ее в браузере. Страница не содержит никакого тела, но все еще работает ..источник
<!ELEMENT html (head, body)>
[1] - и HTML401 Определяет<!ELEMENT HTML O O (%html.content;)
с ,<!ENTITY % html.content "HEAD, BODY">
а также [2]. html51 указываетA head element followed by a body element.
на содержание html. [3] w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/html51/semantics.html#the -html-элемент - Так что я предполагаю , что все эти стандарты HTML общих / в использовании делает требует тега тела. :)Start tag: optional, End tag: optional
Обычно я предпочитаю не использовать
<body onload=""
событие>. Я думаю, что чище держать поведение как можно более отделенным от контента.Тем не менее, есть случаи (обычно довольно редкие для меня), когда использование нагрузки на тело может дать небольшой прирост скорости.
Мне нравится использовать Prototype, поэтому я обычно помещаю что-то вроде этого на
<head
> моей странице:или
Выше приведены трюки, которые я узнал здесь . Мне очень нравится концепция обработчиков событий присоединения вне HTML.
(Изменить, чтобы исправить орфографическую ошибку в коде.)
источник
так много субъективных ответов на объективный вопрос. «Ненавязчивый» JavaScript - это суеверие, как и старое правило никогда не использовать gotos. Напишите код таким образом, который поможет вам надежно достичь своей цели, а не в соответствии с чьими-то модными религиозными убеждениями.
Тот, кто находит:
чрезмерно отвлекать слишком претенциозно и у них нет четких приоритетов.
Я обычно помещаю свой код JavaScript в отдельный файл .js, но я не нахожу ничего сложного в подключении обработчиков событий в HTML, который, кстати, является допустимым HTML.
источник
window.onload
- Вызывается после полной загрузки всех файлов DOM, JS, изображений, фреймов, расширений и других. Это равно $ (window) .load (function () {});body onload=""
- Вызывается после загрузки DOM. Это равно $ (document) .ready (function () {});источник
ready
противonload
событий.load
срабатывает после загрузки всего документа, включая все скрипты, изображения и таблицы стилей.DOMContentLoaded
срабатывает после того, как дерево DOM было построено, но до изображений и т. д. ЭтоDOMContentLoaded
эквивалентноdocument.ready
, а неload
.Там нет разницы ...
Так что принципиально вы можете использовать оба (по одному! -)
Но для удобства чтения и чистоты HTML-кода я всегда предпочитаю window.onload! O]
источник
Если вы пытаетесь написать ненавязчивый код JS (и вы должны это делать), то вам не следует его использовать
<body onload="">
.Насколько я понимаю, разные браузеры работают по-разному, но работают одинаково. В большинстве браузеров, если вы определите оба, один из них будет проигнорирован.
источник
Думайте о нагрузке как о любом другом атрибуте. Например, в поле ввода вы можете поместить:
Или вы можете позвонить:
Атрибут onload работает так же, за исключением того, что он принимает функцию в качестве значения вместо строки, как атрибут value. Это также объясняет, почему вы можете «использовать только один из них» - вызов window.onload переназначает значение атрибута onload для тега body.
Кроме того, как и другие здесь говорят, обычно лучше держать стиль и javascript отдельно от содержимого страницы, поэтому большинство людей советуют использовать window.onload или как готовую функцию jQuery.
источник
<body onload = ""> должен переопределить window.onload.
При <body onload = ""> document.body.onload может иметь значение null, undefined или функцию в зависимости от браузера (хотя getAttribute ("onload") должен быть несколько согласованным для получения тела анонимной функции в виде строки) , С помощью window.onload, когда вы назначаете ему функцию, window.onload будет функцией в разных браузерах. Если это важно для вас, используйте window.onload.
window.onload лучше в любом случае лучше отделить JS от вашего контента. Нет особой причины использовать <body onload = ""> в любом случае, когда вы можете использовать window.onload.
В Opera целью событий для window.onload и <body onload = ""> (и даже window.addEventListener ("load", func, false)) будет окно вместо документа, как в Safari и Firefox. Но «это» будет окном через браузеры.
Это означает, что, когда это имеет значение, вы должны обернуть руду и привести все в соответствие или использовать библиотеку, которая сделает это за вас.
источник
Они оба работают одинаково. Тем не менее, обратите внимание, что если оба определены, будет вызван только один из них. Я вообще избегаю использовать любой из них напрямую. Вместо этого вы можете прикрепить обработчик события к событию загрузки. Таким образом, вы можете легче включать другие пакеты JS, которые также могут присоединять обратный вызов к событию onload.
Любая среда JS будет иметь кросс-браузерные методы для обработчиков событий.
источник
Это общепринятый стандарт для разделения контента, макета и поведения. Таким образом, window.onload () будет более подходящим для использования,
<body onload="">
хотя оба будут выполнять одну и ту же работу.источник
Извините за реинкарнацию этой темы снова после еще 3 лет сна, но, возможно, я наконец-то нашел бесспорную выгоду
window.onload=fn1;
более<body onload="fn1()">
. Это относится к модулям JS или модулям ES : когда вашonload
обработчик находится в «классическом» файле JS (т. Е. Ссылается без него<script type="module" … >
, возможен любой из этих способов; когда вашonload
обработчик находится в файле JS «модуля» (т. Е. Упоминается<script type="module" … >
,<body onload="fn1()">
произойдет сбой с помощью «fn1 () не определено "ошибка. Возможно, причина в том, что модули ES не загружаются до синтаксического анализа HTML ... но это только мое предположение. Во всяком случае,window.onload=fn1;
прекрасно работает с модулями ...источник