窗口加载事件在具有缓存的文档就绪事件之前触发
随着新版本的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实际上是窗口加载的后备。