窗口加载事件在具有缓存的文档就绪事件之前触发

随着新版本的chrome开始发生奇怪的事情,它开始在事件$(document).ready(...)$(function (){...})之前抛出事件$(window).load(...) $(function (){...})

这在以前版本的“chrome”中没有发生,并且在版本31中开始发生。

我的环境:

 jQuery 1.7.2 Chrome 31 IIS 7.5 ASP.NET MVC 4 

我不明白,但它发生了,如果我们第一次进入没有缓存工作完美,但随后与缓存文件css,js,img,开始producirce这个问题。

我目前的解决方案是覆盖jquery的函数load ,但我认为这是正确的解决方案。

谢谢。

编辑

我们只能在服务器上播放该站点,我们无法在本地重现它(localhost)

编辑更多信息这是服务器的HTTP标头:

 HTTP/1.1 200 OK Cache-Control: private, s-maxage=0 Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNetMvc-Version: 3.0 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Thu, 21 Nov 2013 23:02:37 GMT Content-Length: 176350 

编辑二

我测试了这段代码,知道它是否是jQuery 1.7.1的问题,但同样的问题发生了:

 (function() { if(!window.addEventListener || !document.addEventListener) { console.log('not supported window.addEventListener'); } var timeDCL; function addListener(obj, eventName, listener) { obj.addEventListener(eventName, listener, false); } function finishedDCL() { timeDCL = new Date(); console.log('DONE document load/ready'); } function finishedLoad() { if(timeDCL) { var delta = new Date() - timeDCL; console.log(delta + 'ms', 'DONE window load'); } else { console.log('Ups DONE first window load'); } } addListener(document, "DOMContentLoaded", finishedDCL); addListener(window, "load", finishedLoad); }()); 

结果:

 Ups DONE first window load DONE document load/ready 

TL; DR
不要依赖于load始终遵循DOMContentLoaded


我知道我在游戏中已经很晚了,但其他人可能会在这里结束,所以我发布了这个。 当“DOM ready”实现的unit testing随机失败时,我遇到了这种行为。 我发现原因是它假设窗口加载事件总是在DOMContentLoaded之后。

至少在Chrome中 – 目前在52版本 – 一些压力条件(可能与不那么小的javascript库有关,比如jQuery,但我不能肯定地说)可能会发生,因此花费很长时间来解析DOM ,这会延迟DOMContentLoaded事件。

请注意,在每次故障中, load事件仅在1ms之前触发。

看起来浏览器可以同时触发这两个事件,并选择首先使用DOM。 不管出于什么原因

jQuery.ready实际上是窗口加载的后备。

DevTool的截图在一个这样的场合