window.onload
事件和body
标签的onload
事件有什么区别?我应该在何时使用它们,如何正确使用呢?
window.onload
事件和body
标签的onload
事件有什么区别?我应该在何时使用它们,如何正确使用呢?
window.onload = myOnloadFunc
和 <body onload="myOnloadFunc();">
是使用相同事件的不同方法。使用window.onload
较为不显眼,因为它能将JavaScript代码从HTML中分离出来。
所有常见的JavaScript库,如Prototype、ExtJS、Dojo、JQuery、YUI等,都提供了对文档加载时发生的事件的良好封装。您可以监听窗口的onLoad事件,并对此做出反应,但是只有在所有资源下载完成后才会触发onLoad事件,所以您的事件处理程序直到最后一个大图片被获取后才会执行。在某些情况下,这正是您想要的结果,而在其他情况下,您可能会发现监听DOM何时准备好更合适——这个事件类似于onLoad但是不需要等待图像等资源下载完毕。
onload
事件将在全局上下文环境中调用 myOnloadFunc()
(this
会指向window
)。而通过JavaScript设置它将使其在元素的上下文环境中执行(this
指向触发事件的元素)。在这种特定情况下,这不会造成影响,但对于其他元素来说则会有所不同。 - mowwwalkerthis
所引用的对象。 - Richard Turner这两种方法并没有区别,但都不应该使用。
在许多浏览器中,window.onload
事件只有在所有图片加载完成后才会触发,这通常不是我们想要的。标准化的浏览器有一个名为 DOMContentLoaded
的事件可以提前触发,但是IE浏览器(截至回答撰写时)不支持该事件。建议使用支持跨浏览器的 DOMContentLoaded
功能的JavaScript库,或查找可用的高质量函数。jQuery的 $(document).ready()
是一个很好的例子。
window.onload
可以在没有body的情况下工作。创建只包含脚本标签的页面并在浏览器中打开它。该页面不包含任何主体,但仍然可以正常工作。
<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也规定了对于HTML内容需要一个 head 元素后跟一个 body 元素。[3] 因此,我想所有这些常见/正在使用的HTML标准都要求有一个body标签。 :) - Kissaki开始标签:可选,结束标签:可选
- OdraEncoded通常情况下,我更喜欢不使用<body onload=""
>事件。我认为尽可能将行为与内容分离会更加清晰。
话虽如此,有时(对我来说通常很少)使用body onload可以略微提高速度。
我喜欢使用Prototype,所以我通常会将类似以下内容放在页面的<head
>中:
document.observe("dom:loaded", function(){
alert('The DOM is loaded!');
});
或者Event.observe(window, 'load', function(){
alert('Window onload');
});
以上是我从这里学到的技巧。我非常喜欢在HTML之外附加事件处理程序的概念。
(编辑以更正代码中的拼写错误。)
有关一个客观问题的主观答案太多了。"不显眼"的JavaScript就像旧时规则中从不使用goto一样迷信。编写代码应该有助于您可靠地实现目标,而不是根据某些时髦的宗教信仰。
任何发现以下情况的人:
<body onload="body_onload();">
过于分散注意力是过于自以为是,说明他们没有把优先事项放在首位。
我通常将JavaScript代码放在单独的.js文件中,但我发现在HTML中挂钩事件处理程序并不麻烦,而且这也是有效的HTML。
window.onload
- 在所有DOM元素、JS文件、图片、IFrames、扩展等完全加载后调用。这相当于$(window).load(function() {})
;
<body onload="">
- DOM加载后只会被调用一次。这相当于$(document).ready(function() {})
;
这两种方式没有区别,你可以同时使用它们(但是一次只能用一个)。
但是为了可读性和html代码的整洁性,我总是更喜欢使用window.onload!o]
<body onload="">
应该覆盖 window.onload
。
使用 <body onload="">
,document.body.onload
在不同浏览器中可能为 null、undefined 或函数(尽管 getAttribute("onload")
可以相对一致地获取匿名函数体作为字符串)。而当你将一个函数分配给 window.onload
时,window.onload
将在各个浏览器中始终是一个函数。如果这很重要,就使用 window.onload
。
无论如何,window.onload
更适合将 JS 与您的内容分离。当您可以使用 window.onload
时,没有太多理由使用 <body onload="">
。
在 Opera 中,window.onload
和 <body onload="">
的事件目标(甚至 window.addEventListener("load", func, false))
将是窗口,而不像 Safari 和 Firefox 中那样是文档。但是,'this' 在各个浏览器中都是窗口。
这意味着,在需要时,您应该包装 crud 并使事情保持一致,或者使用一个为您完成此操作的库。
<body onload="">
。把onload想象成任何其他属性。例如,在输入框上,您可以放置:
<input id="test1" value="something"/>
或者你可以打电话:
document.getElementById('test1').value = "somethingelse";
onload属性的作用方式相同,只是它将函数作为其值而不是像value属性一样的字符串。这也解释了为什么你只能“使用其中之一”——调用window.onload会重新分配body标签的onload属性的值。
此外,就像其他人在这里说的那样,通常最好将样式和JavaScript与页面内容分开,这就是为什么大多数人建议使用window.onload或像jQuery的ready函数的原因。