JS window.onload 使用与 Document 的区别

3

window.onload 在我阅读资料的时候似乎可以与 document.onload 松散地互换,但我的经验表明这是不正确的。我继承了一个 JavaScript 脚本,但我不确定该如何纠正它。我希望在 DOM 加载完成后执行 JS,而不是等到所有资源都加载完毕。我该怎么做呢?

目前我的代码是:

window.onload = initDropMenu;

我尝试过:

 document.onload = initDropMenu;

这只会导致菜单无法加载。我还尝试过从JS中完全删除该行,然后通过DOM执行它:

<body onload="initDropMenu()">

这也导致菜单没有显示,并且控制台中也没有出现任何错误。我的JS知识有限,我错过了什么?


1
我从未听说过document.onload。但是<body onload=...>应该可以工作,它相当于window.onload - Barmar
1
<body onload=...> 在页面加载时不会出现菜单,在控制台中也不会出现任何错误信息。我以前从未听说过 document.onload,但我的阅读资料告诉我它是存在的,https://dev59.com/FHRB5IYBdhLWcg3wj36c…或者是我误解了那个线程和它的使用方式? - chris85
2
可能会使用 https://developer.mozilla.org/zh-CN/docs/Web/Events/DOMContentLoaded。 - William Fleming
1
我认为答案将document.onloaddocument.onDOMContentLoaded混淆了。请注意,它没有像window.onload一样提供document.onload的链接。 - Barmar
1
@chris85 干得好!那应该没问题,这就是 jQuery 内部使用的 $().ready 函数。https://github.com/jquery/jquery/blob/master/src/core/ready.js#L79-L83 - William Fleming
显示剩余6条评论
1个回答

10

window的加载事件:

加载事件在文档加载过程的末尾触发。此时,文档中的所有对象都在DOM中,所有的图片、脚本、链接和子框架都已经完成加载
[来源:developer.mozilla.org]

    <script>
       window.onload = function(){ init(); };
    </script>

HTML元素的加载事件:

load事件在资源及其依赖资源完成加载时触发。
[来源:developer.mozilla.org]

    <!-- When the image is loaded completely -->
    <img onload="image_loaded()" src="w3javascript.gif">

    <!-- When the frame is loaded completely (including all resources) -->
    <iframe onload="frame_loaded()" src="about.html">

    <!-- When body loaded completely (including all resources, images and iframes) -->
    <body onload="init()">

很多论坛甚至是本站的一些回答可能会误导你,但是在文档元素上触发的load事件不仅等同于窗口上的load事件,它们其实就是同一个事件。下面的引用证明了这一点。
“出于历史原因,一些<body><frameset>元素上的属性/特性实际上设置了它们的父窗口对象上的事件处理程序。(HTML规范将这些命名为:onblur、onerror、onfocus、onload、onscroll。)” 【来源:developer.mozilla.orgDOMContentLoaded 事件: 开发人员应该使用文档上的DOMContentLoaded事件,它在html完全加载和解析后触发。
    document.addEventListener("DOMContentLoaded", function(event) {
        alert("Document is ready");
    });

DOMContentLoaded事件会在初始的HTML文档已经被完全加载和解析后触发,不需要等待样式表、图片和子框架的加载。一个完全加载的页面应该只使用非常不同的load事件来检测。常见的错误是在应该使用DOMContentLoaded事件的情况下使用load事件,因此请谨慎使用。
[来源:developer.mozilla.org]

将函数设置为 window.onload 只允许在窗口加载时发生一件事情(即您在该函数中定义的任何内容),而 addEventListener 允许订阅到加载事件的任意数量的事情被触发。有可能存在其他代码使用了 window.onload=function(),并且是在您的菜单代码之后定义的,因此您的菜单代码被覆盖了吗?使用 window.onload 而不是事件监听器是非常常见的做法:jsBin example - thmsdnnr
解释如下,没有所谓的 document.onload。你必须使用 DOMContentLoaded 事件来实现你想要做的事情。如果需要更多澄清,请询问。 - Munim Munna
Body onload 是 window.onload 的别名。它在所有资源都完全加载完成时触发,domcontentloaded 在仅加载 HTML 时触发。 - Munim Munna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接