从jQuery源码阅读看 dom load
最近两天不忙的时候再回过来研究一下jquery的源码,看到$(document).ready()时,深入的研究了一下dom的加载问题。
我们都知道,window.onload可以解决我们的js执行时机问题。有了它,可以把代码放在页面的任何位置。但是我们也知道,window.onload 要在html、css、js、img全部加载完后才会触发,而这样会影响页面的访问速度。因此,jquery通过封装$(function)做到了DOM加载完毕时就对js内容进行触发。
那jquery做到的原理是什么呢?我从原理上简单的做一下分析。
在IE9+、chorme、firefox等现代浏览器中,有个原生的js事件:DOMContentLoaded 当这个事件触发时,就说明DOM已经加载完毕,可以进行下面的js操作了
document.addEventListener('DOMContentLoaded',function(){alert(123);},false);
但是IE8以下是不支持这个事件的,所以IE用的是onreadystatechange事件
document.onreadystatechange = function(){
if(document.readyState == 'complete'){
alert('Dom已经加载完毕')
}
}
但是,非标准浏览器不会这么容易让我们好过。
首先,当document.readyState == 'complete'时,图片等文件已经加载完成了,虽然会在window.onload 之前执行,但是对交互效果来说还是触发的太晚了。有些站点的图片要下载下来是很慢很慢滴!
我在这里随便举个例子:
<body>
<div>12345555555555555555555555555</div>
<img src="http://b.hiphotos.baidu.com/zhidao/pic/item/c8177f3e6709c93da9f2dafa9b3df8dcd10054bf.jpg" alt=""> <script> alert(111)
window.onload = function(){
alert(456)
}
document.onreadystatechange = function(){
if(document.readyState == 'complete'){
alert(123);
//complete是指所有资源包括图片js等文件全部加载完成后才会触发。
//readyState == 'complete'确实会在onload前触发,但是还是触发的太晚。
}
} </script>
</body>
大家看,在IE8下,当页面执行时,首先弹出111,这毫无疑问。然后呢?对不起,是图片在页面中完全显示出来。然后再弹出123,最后弹出456.
再次,alert(123)执行时机也不确定,因为同一段代码,再IE7中,或者更高层的IE9种,有时图片还没有加载下来,alert(123)执行了。所以单纯使用这个readyState不太靠谱
那么jquery中是如何做的呢?jquery中用了一个IE才能识别的属性:document.documentElement.doScroll
这是个什么东东?好像从来没有见过? 这就是学习源码的好处,可以看看大师级人物是如何做处理的,并且我们可以从中取其精华,好不惬意!
兼容不支持该事件的浏览器
在IE8中,可以使用readystatechange事件来检测DOM文档是否加载完毕.在更早的IE版本中,可以通过每隔一段时间执行一次document.documentElement.doScroll("left")来检测这一状态,因为这条代码在DOM加载完毕之前执行时会抛出错误(throw an error)。
doScroll通过时readyState可能为interactive, 也可能为complete. 但是一定会在DOM结构稳定后, 图片加载完毕前执行.
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
} try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch(e) {
setTimeout( doScrollCheck, 1 );
return;
} // and execute any waiting functions
jQuery.ready();
}
这是jquery的源码,通过异常捕获,如果DOM没有加载完,则会一直catch这个setTimeout ,直到dom加载完,执行以下try里面的doScroll
具体doScroll的详细含义大家可以从网上查查,我这里就不列举了
MSDN 关于 JScript 的一个方法有段不起眼的话,当页面 DOM 未加载完成时,调用 doScroll 方法时,会产生异常。那么我们反过来用,如果不异常,那么就是页面DOM加载完毕了!
当然,doScroll的运用前提是页面中没有iframe,如果有iframe,那么只能是图片之类的全加载完毕才执行了。
从jQuery源码阅读看 dom load的更多相关文章
- jquery源码阅读(1)
每天坚持阅读一定量的的jquery代码,积少成多!加油加油! jquery-2.2.1的9161~9194行 1 if ( typeof define === "function" ...
- JQuery源码阅读记录
新建html文件,在浏览器中打开文件,在控制台输入consoole.log(window);新建html文件,引入JQuery后在浏览器中打开,在控制台同样输入consoole.log(window) ...
- jquery源码阅读笔记一
1. jquery无new的构造函数. 无new的构造函数是怎么实现的.比如我们一般这么用jQuery. $(".test").text(); 但是我们一般是这么写的. var t ...
- jQuery源码分析系列
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...
- [转]jQuery源码分析系列
文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...
- jQuery源码分析系列(转载来源Aaron.)
声明:非本文原创文章,转载来源原文链接Aaron. 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAa ...
- jQuery源码分析系列——来自Aaron
jQuery源码分析系列——来自Aaron 转载地址:http://www.cnblogs.com/aaronjs/p/3279314.html 版本截止到2013.8.24 jQuery官方发布最新 ...
- jquery源码分析学习地址
http://www.ccvita.com/121.htmljQuery工作原理解析以及源代码示例http://www.cnblogs.com/haogj/archive/2010/04/19/171 ...
- jquery 源码分析学习地址
http://www.ccvita.com/121.htmljQuery工作原理解析以及源代码示例http://www.cnblogs.com/haogj/archive/2010/04/19/171 ...
随机推荐
- logcat 基本使用
adb logcat -c //清空以前的日志 adb logcat -v time > d:/sss.log //将当前日志输出到d盘的sss.log中 sss.log不 ...
- 技海拾贝 - Java
1. Java中的多线程 http://blog.csdn.net/luoweifu/article/details/46673975 Java中继承thread类与实现Runnable接口的区别 h ...
- UE4 VR 模式全屏 4.13
以前写了一个4.11版本全屏,高版本的没用所以也不清楚情况,最近出了4.13,刚好新项目要用上打包出来以后发现,控制台命令fullscreen没有用了, 被stereo on 替代,但是还是没有全屏, ...
- MySql 中游标,事务,终止存储过程方法总结
最近在项目开发中,有段逻辑处理,需要在网站,app,后台分别运行,这样给后期的维护带来了很大的不方便,容易遗漏app端或者后台,所以讲java代码转换成存储过程,把逻辑处理写在了mysql端,其中遇到 ...
- PL_SQL导入数据库数据
首先用pl/sql将数据批量导出或者全部导出具体操作如下 点击工具 ----->导出数据---->SQL插入 导出的数据格式如下: prompt PL/SQL Developer im ...
- 我是如何社工TDbank获取朋友隐私的
原创 ziwen@beebeeto 转载请保留本行 个人感觉 国外的安全方面对社工的了解和防范并不是很好 即使他们使用社工的时间比我们要长很多 比如 他们的visa在pos机上使用是不需要密码的 而且 ...
- 《C专家编程》第一章——C:穿越时空的迷雾
这一章讲的是C语言的发展史,包括它是多么不经意的诞生,而后又经历了早期C.K&C.ANSI C的各种阶段,直到它现在形成的这个样子.C语言从来不是一门完美的语言,所以它一直在发展,直到今日,它 ...
- 程序员写的东西出了bug,造成了损失谁来承担?
这是个持续多年的话题了,很多大公司,尤其是牛逼的独立分包公司(开发公司)都会有代码审核和严格QA程序,一般的公司就很难说咯,在法律上目前还没有完全支持处罚程序员bug经济损失的判例(国内如此),国外也 ...
- RET2LIBC 练习(3) -- VIRTUALALLOC
国庆假期没事做了几道pwn题练手,等有时间在贴出pwn题的分析. 利用VIRTUALALLOC的方法绕过DEP其实和之前的方法大同小异了,只是VIRTUALALLOC开辟了一段新的可执行的内存空间,然 ...
- 激!QTREE系列
我现在才开始刷 QTREE 是不是太弱了?算了不管他…… QTREE: 树链剖分裸题(据说 lct 会超时……该说是真不愧有 spoj 的气息吗?) #include <cstdio> # ...