Ответы:
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может работать без тела. Создайте страницу только с тегами скрипта и откройте ее в браузере. Страница не содержит никакого тела, но все еще работает ..
<script>
function testSp()
{
alert("hit");
}
window.onload=testSp;
</script>
<!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> моей странице:
document.observe("dom:loaded", function(){
alert('The DOM is loaded!');
});
или
Event.observe(window, 'load', function(){
alert('Window onload');
});
Выше приведены трюки, которые я узнал здесь . Мне очень нравится концепция обработчиков событий присоединения вне HTML.
(Изменить, чтобы исправить орфографическую ошибку в коде.)
так много субъективных ответов на объективный вопрос. «Ненавязчивый» JavaScript - это суеверие, как и старое правило никогда не использовать gotos. Напишите код таким образом, который поможет вам надежно достичь своей цели, а не в соответствии с чьими-то модными религиозными убеждениями.
Тот, кто находит:
<body onload="body_onload();">
чрезмерно отвлекать слишком претенциозно и у них нет четких приоритетов.
Я обычно помещаю свой код 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.
Если вы пытаетесь написать ненавязчивый код JS (и вы должны это делать), то вам не следует его использовать <body onload="">.
Насколько я понимаю, разные браузеры работают по-разному, но работают одинаково. В большинстве браузеров, если вы определите оба, один из них будет проигнорирован.
Думайте о нагрузке как о любом другом атрибуте. Например, в поле ввода вы можете поместить:
<input id="test1" value="something"/>
Или вы можете позвонить:
document.getElementById('test1').value = "somethingelse";
Атрибут 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;прекрасно работает с модулями ...