DOMReady实现策略
    * 在页面的DOM树创建完成后(即HTML解析第一步完成)就触发,而无需等待其他资源的加载,即DOMReady实现策略
    * 支持DOMContentLoaded事件的浏览器: 就使用DOMContentLoaded事件
    * 不支持DOMContentLoaded事件的浏览器: 使用Hack兼容
    * 通过IE中的document.documentElement.doScroll('left')来判断DOM树是否创建完毕

代码实现

function myReady(fn){

    if(document.addEventListener){
document.addEventListener('DOMContentLoaded',fn,false);
}else{//低版本浏览器
IEContentLoaded(fn);
} //IE模拟DOMContentLoaded
function IEContentLoaded(fn){
var d = window.document;
var done = false;
//值执行一次用户的回调函数init();
var init = function(){
if(!done){
done = true;
fn();
}
}; (function(){
try{
//DOM树未创建完之前调用doScroll会抛出错误
d.documentElement.doScroll('left');
}catch(e){
//延迟在试一次,
//var func = function() { alert(func === arguments.callee);}func();
   //执行上述代码,可以看到alter出来的结果是true,注意,此处用的是“===”,就是说func与arguments.callee对象类型和值都相等。
setTimeout(arguments.callee,50);
return;
}
init();
})(); //监听document的加载状态
d.onreadystatechange = function(){
//如果用户是在domReady之后绑定的函数,就立马执行
if(d.readyState == 'complete'){
d.onreadystatechange = null;
init();
}
}
}
}

为什么使用domReady来代替onload?

* onload是需要等待页面所有资源都加载完毕,才触发

* domReady是DOM加载完就触发

我们下面看个例子

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>domReady</title>
<script src="domReady.js"></script>
</head>
<body>
<div id="showMsg"></div>
<div>
<img src="data:images/1.jpg"/>
<img src="data:images/2.jpg"/>
<img src="data:images/3.jpg"/>
</div>
<script>
var d = document;
var msgBox = d.getElementById('showMsg');
var imgs = d.getElementsByTagName('img');
var time1 = null,time2 = null;
myReady(function(){
msgBox.innerHTML += "dom已加载!<br>";
time1 = new Date().getTime();
msgBox.innerHTML += "时间戳:" + time1 + "<br>";
});
window.onload = function(){
msgBox.innerHTML += "onload已加载!<br>";
time2 = new Date().getTime();
msgBox.innerHTML += "时间戳:" + time2 + "<br>";
msgBox.innerHTML += "domReady比onload快" + (time2 - time1) + "ms<br>";
};
</script>
</body>
</html>

最新文章

  1. 正确获取访问者ip
  2. vue学习笔记之属性和方法
  3. python3 入门 (一) 基础语法
  4. 创建podSpec,使用pod管理第三方库
  5. tcp/ip分片
  6. 4、android xml中drawableTop(drawableBoottom、drawableLeft、drawableRight)在java代码中的动态配置
  7. 选错实施顾问公司 ERP项目九死一生
  8. Android应用开发学习—Toast使用方法大全
  9. Android中解析JSON形式的数据
  10. Android UI开发第三十一篇——Android的Holo Theme
  11. Js节点属性与方法
  12. Flex读取txt文件里的内容(二)
  13. 一道关于call和this的JS面试题
  14. Java与算法之(10) - 希尔排序
  15. mmap 测试的一些坑
  16. SpringBoot的第一个例子
  17. 数据库链接池c3p0的配置
  18. 用wiershark抓dns数据包
  19. 对java高级程序员有益的十本书
  20. 浅谈C#中的 async await 以及对线程相关知识的复习

热门文章

  1. ios开发——实用技术篇Swift篇&amp;地址薄、短信、邮件
  2. grunt自动化工具
  3. Cache和Buffer的区别
  4. mysql索引需要了解的几个注意
  5. Invalidate、RedrawWindow与UpdateWindow
  6. 各种电子面单_Api接口
  7. Java用筛子法求素数
  8. cocos2d-x lua 触摸事件
  9. iOS 延时加载
  10. [改善Java代码]断言绝对不是鸡肋