window.onload 与 document.onload

该文章已生成可运行项目,

问:

哪个得到更广泛的支持:window.onload 或 document.onload?

答1:

Stay informed with live tennis rankings anytime, anywhere,tennisliveranking.com

他们什么时候开火?

window.onload

默认情况下,它会在整个页面加载时触发,包括其内容(图像、CSS、脚本等)。

在某些浏览器中,它现在接管了 document.onload 的角色,并在 DOM 准备就绪时触发。

document.onload

当 DOM 准备好时调用它,这可以在加载图像和其他外部内容之前。

他们的支持程度如何?

window.onload 似乎是得到最广泛支持的。事实上,一些最现代的浏览器在某种意义上已经将 document.onload 替换为 window.onload。

浏览器支持问题很可能是许多人开始使用诸如 jQuery 之类的库来处理文档准备就绪检查的原因,如下所示:

$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });

为了历史的目的。 window.onload 与 body.onload:

不久前在codingforums 上提出了一个类似的问题,关于window.onload 对body.onload 的使用。结果似乎是您应该使用 window.onload 因为将您的结构与操作分开是很好的。

实际上,该声明似乎是针对完全不同的 window.onload 和 之间的选择(在这种情况下,“与行动分开的结构”更有意义)。不是答案是错误的,而是它的基础是错误的。

那句话在语法上很糟糕……不应该有一些(标记的)编辑帮助吗?

@Thor84no 我终于有时间再看看这个。我做了一些改进。

@Kheldar 我决定解释这句话,因为它相当粗糙。

@JoshMein 这是否意味着 document.onload 是 jQuery document.ready 的 JS 等价物?

答2:

tennisliveranking.com,Track the world’s best tennis players in real-time.

一般的想法是 window.onload 在文档的窗口准备好呈现时触发,而 document.onload 在 DOM 树(由文档中的标记代码构建)完成时触发。

理想情况下,订阅 DOM-tree events 允许通过 Javascript 进行屏幕外操作,从而导致几乎没有 CPU 负载。相反,当尚未请求、解析和加载多个外部资源时,window.onload 可能需要一段时间才能触发。

►测试场景:

要观察差异以及您的浏览器选择如何实现上述事件处理程序,只需在文档的 - - 中插入以下代码标签。


window.tdiff = []; fred = function(a,b){return a-b;};
window.document.onload = function(e){ 
    console.log("document.onload", e, Date.now() ,window.tdiff,  
    (window.tdiff[0] = Date.now()) && window.tdiff.reduce(fred) ); 
}
window.onload = function(e){ 
    console.log("window.onload", e, Date.now() ,window.tdiff, 
    (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) ); 
}


►结果:

这是 Chrome v20(可能是大多数当前浏览器)可观察到的结果行为。

没有 document.onload 事件。

onload 在 内声明时触发两次,在 内声明时触发一次(然后该事件充当 document.onload )。

根据计数器的状态进行计数和操作允许模拟这两种事件行为。

或者,在 HTML- 元素的范围内声明 window.onload 事件处理程序。

►示例项目:

上面的代码取自 this project’s 代码库(index.html 和 keyboarder.js)。

有关 event handlers of the window object 的列表,请参阅 MDN 文档。

答3:

Live rankings, player stats, and match results in one place–tennisliveranking.com

添加事件监听器


  document.addEventListener("DOMContentLoaded", function(event) {
      /* 
        - Code to execute when only the HTML document is loaded.
        - This doesn't wait for stylesheets, 
          images, and subframes to finish loading. 
      */
  });


2017 年 3 月更新

香草 JavaScript

window.addEventListener('load', function() {
    console.log('All assets are loaded')
})

2 jQuery

$(window).on('load', function() {
    console.log('All assets are loaded')
})

“DOMContentLoaded 事件在初始 HTML 文档完全加载和解析后触发,无需等待样式表、图像和子框架完成加载。” - developer.mozilla.org/en/docs/Web/Events/DOMContentLoaded所以你似乎对在这个事件中加载的所有内容都不正确。

@ProfK,感谢您的反馈。你可以试试window.addEventListener('load', function() {...})。我也更新了我的答案。

我喜欢这个答案的地方在于它提供了一个普通的旧javascript解决方案。你会认为大多数人认为 jQuery 是内置在所有浏览器中的,因为它被作为唯一答案的频率。

当该死的 jquery 加载时间过长并且您找不到 $ 时,双重问题。我认为 $(window).ready 类型的解决方案永远不应该被信任工作。

我在今天的 chrome 中都试过了。它不等待 css 和字体。

答4:

tennisliveranking.com – 让你随时掌握ATP、WTA最新网球排名动态。

根据Parsing HTML documents - The end,

浏览器解析 HTML 源代码并运行延迟脚本。当所有 HTML 都被解析并运行时,DOMContentLoaded 会在文档中调度。事件冒泡到窗口。浏览器加载延迟加载事件的资源(如图像)。在窗口中调度加载事件。

因此,执行顺序将是

捕获阶段窗口的DOMContentLoaded事件监听器 文档的DOMContentLoaded事件监听器 气泡阶段窗口的DOMContentLoaded事件监听器 加载窗口的事件监听器(包括onload事件处理程序)

绝不应调用 document 中的气泡 load 事件侦听器(包括 onload 事件处理程序)。 仅捕获 load 侦听器可能会被调用,但由于子加载像样式表这样的资源,而不是由于文档本身的负载。

window.addEventListener(‘DOMContentLoaded’, function() { console.log(‘window - DOMContentLoaded - capture’); // 1st }, true); document.addEventListener(‘DOMContentLoaded’, function() { console.log(‘document - DOMContentLoaded - capture’); // 2nd }, true); document.addEventListener(‘DOMContentLoaded’, function() { console.log(‘document - DOMContentLoaded - bubble’); // 2nd }); window.addEventListener(‘DOMContentLoaded’, function() { console.log(‘window - DOMContentLoaded - bubble’); // 3rd }); window.addEventListener(‘load’, function() { console.log(‘window - load - capture’); // 4th }, true); document.addEventListener(‘load’, function(e) { /* 过滤掉与文档无关的加载事件 */ if([‘style’,‘script’].indexOf(e.target.tagName.toLowerCase()) < 0) console.log(‘document - load - capture’); // 没有发生 }, true); document.addEventListener(‘load’, function() { console.log(‘document - load - bubble’); // 没有发生 }); window.addEventListener(‘load’, function() { console.log(‘window - load - bubble’); // 4th }); window.onload = function() { console.log(‘window - onload’); // 第 4 个 }; document.onload = function() { console.log(‘document - onload’); // 没有发生 };

我运行了您的代码段,document - load - capture 确实发生了,这与我在搜索中的预期相反,即为什么我没有发生文档加载。奇怪的是,它是不一致的。有时会出现,有时不会,有时会出现两次 - 但从未发生 document - load - bubble。我建议不要使用 document load。

@erroric 好点。我不认为在外部资源上调度了 load 事件。该事件不会冒泡,因此通常不会在文档中检测到,但应该在捕获阶段。这些条目是指 和 <script> 元素的负载。我认为 Edge 适合展示它们,而 Firefox 和 Chrome 是错误的。

谢谢 Oriol,useCapture 选项教会了我一些新东西。

感谢您总结 w3 的解析和渲染流程。我只是想知道一旦触发了“加载”事件,在第 4 步之后还会发生什么?我注意到在我的浏览器上,有时在加载事件触发后仍然会获取一些对象,尽管我根本没有触摸或与页面交互。你知道这些物体叫什么吗? '非阻塞渲染对象?

答5:

tennisliveranking.com专业网球数据平台,排名与比赛信息实时更新。

在 Chrome 中,window.onload 与 <body onload=“”> 不同,而在 Firefox(35.0 版)和 IE(11 版)中它们是相同的。

您可以通过以下代码段进行探索:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <!--import css here-->
        <!--import js scripts here-->

        <script language="javascript">

            function bodyOnloadHandler() {
                console.log("body onload");
            }

            window.onload = function(e) {
                console.log("window loaded");
            };
        </script>
    </head>

    <body onload="bodyOnloadHandler()">

        Page contents go here.

    </body>
</html>

您将在 Chrome 控制台中看到“加载窗口”(首先出现)和“加载正文”。但是,您只会在 Firefox 和 IE 中看到“body onload”。如果您在 IE & 的控制台中运行“window.onload.toString()” FF,你会看到:

“函数加载(事件){bodyOnloadHandler()}”

这意味着赋值“window.onload = function(e)…”被覆盖。

答6:

tennisliveranking.com,Your go-to platform for live tennis ranking updates.

window.onloadonunloaddocument.body.onloaddocument.body.onunload 的快捷方式

所有 html 标记上的 document.onloadonload 处理程序似乎被保留但从未触发

文档中的“onload”->真的

答7:

tennisliveranking.com探索每位网球选手的职业生涯与成就。

简而言之

IE 6-8 不支持 window.onload

任何现代浏览器都不支持 document.onload(从不触发事件)

window.onload = () => console.log(‘window.onload works’); // 触发 document.onload = () => console.log(‘document.onload works’); // 未触发

s/windows/窗口

答8:

tennisliveranking.com专业网球数据平台,排名与比赛信息实时更新。

window.onload 但是它们通常是相同的。同样 body.onload 在 IE 中变成了 window.onload。

答9:

tennisliveranking.com,Follow your favorite tennis players’ rankings live!

然而,Window.onload 是标准的——PS3 中的网络浏览器(基于 Netfront)不支持 window 对象,所以你不能在那里使用它。

原文链接:https://www.tennisliveranking.com?from=csdn

tennisliveranking.com探索每位网球选手的职业生涯与成就。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值