在JavaScript中,当我想在页面加载时运行一次脚本时,我应该使用window.onload
还是只编写脚本?
例如,如果我想要一个弹出窗口,我应该写(直接在<script>
标签内):
alert("hello!");
要么:
window.onload = function() {
alert("hello!");
}
两者似乎都在加载页面后运行。有什么区别?
window.onload
只是在浏览器到达时运行。
window.addEventListener
在运行之前等待窗口加载。
通常你应该做第二个,但你应该附加一个事件监听器而不是定义函数。例如:
window.addEventListener('load',
function() {
alert('hello!');
}, false);
其他答案似乎都过时了
首先,将脚本放在顶部并使用window.onload
是一种反模式。最糟糕的情况是IE浏览器时代遗留下来,或者误解了JavaScript和浏览器。
您可以将脚本移动到html的底部
<html>
<head>
<title>My Page</title>
</head>
<body>
content
</body>
<script src="some-external.js"></script>
<script>
some in page code
</script>
</html>
人们使用window.onload
的唯一原因是他们错误地认为脚本需要进入head
部分。因为如果你的脚本在head部分中,所以事情是按顺序执行的,那么按顺序执行定义时,正文和你的内容还不存在。
hacky解决方法是使用window.onload
等待页面的其余部分加载。将脚本移动到底部也解决了这个问题,现在没有必要使用window.onload
,因为你的身体和内容已经被加载了。
更现代的解决方案是在脚本上使用defer
标记,但要使用脚本需要全部是外部的。
<head>
<script src="some-external.js" defer></script>
<script src="some-other-external.js" defer></script>
</head>
这样做的好处是浏览器会立即开始下载脚本,它会按照指定的顺序执行它们,但它会等到页面加载后执行它们,不需要window.onload
或更好但仍然不需要的window.addEventListener('load', ...
根据它:
load文件在文档加载过程结束时触发。此时,文档中的所有对象都在DOM中,并且所有图像和子帧都已完成加载。
只要浏览器在HTML中找到这个位置,您的第一段代码就会运行。
当DOM和所有图像完全加载时,第二个片段将触发弹出窗口(请参阅规范)。
考虑到alert()
函数,它将在哪个点运行并不重要(除了window
对象之外它不依赖于任何东西)。但是如果你想操纵DOM - 你肯定应该等待它正确加载。
这取决于您是否希望它在遇到脚本元素时运行,或者您希望它在load事件触发时运行(在整个文档(包括图像之类)之后加载)。
两者都不对。
但是,一般情况下,我会避免将函数直接赋值给onload
,转而使用addEventListener
(如果需要支持旧浏览器,则使用兼容库)。
等待加载DOM的原因是您可以定位脚本后加载的任何元素。如果您只是创建一个alert
,那没关系。但是,假设您在脚本之后定位了标记中的div
,如果您不等到要加载的DOM树的那一部分,则会出现错误。
如果你使用jQuery,document.ready
是window.onload
的绝佳替代品。
你有三种选择:
document.addEventListener( "DOMContentLoaded", function(){});
内部将运行它。window.onload function(){})
内部将在加载所有页面资源后立即运行。