提取jQuery.ready(),页面DOM原生加载完毕执行onDOMReady()

在大部分前端开发中,需要在DOM树载入时马上执行一些函数,但又不愿意仅为了这一个需求而引入整个jQuery库,于是就把jQuery的ready方法提取出来,单独使用了。 当然大家可以使用windows.onload事件, 但onload在浏览器看来,就是页面上的东西(img,iframe等资源)全部都加载完毕后才能发生, 如果页面内有大的图片的话,会在页面展现后好久时间后才执行。 如果只需要对DOM进行操作,那么这时就没必要等到页面全部加载了。我们需要更快的方法。 Firefox有DOMContentLoaded事件可以轻松解决,可惜的就是IE没有。 MSDN关于JSCRIPT的一个方法有段不起眼的话,当页面DOM未加载完成时,调用doScroll方法时,会产生异常。 那么我们反过来用,如果不异常,那么就是页面DOM加载完毕了! 所以 对于Mozilla & Opera 浏览器,在dom树载入后有现成的 DOMContentLoaded 事件 对于Safari 浏览器,有document.onreadystatechange事件, 当该事件触发时,如果 document.readyState=complete时,可视为dom树已经载入 对于ie,当在iframe内时,同样有document.onreadystatechange事件, 对于ie在非iframe内时,只有不断地通过能否执行doScroll判断dom是否加载完毕。 在本例中每间隔5毫秒尝试去执行 document.documentElement.doScroll('left') 另外要注意一点:在ie8下,貌视非iframe窗口也会有document.onreadystatechange事件,另外你也可以在构建自己的JS框架时使用此函数.

 

 
  
1 ( function (){
2   var isReady = false ; // 判断onDOMReady方法是否已经被执行过
3   var readyList = []; // 把需要执行的方法先暂存在这个数组里
4   var timer; // 定时器句柄
5 ready = function (fn) {
6 if (isReady )
7 fn.call( document);
8 else
9 readyList.push( function () { return fn.call( this );});
10 return this ;
11 }
12 var onDOMReady = function (){
13 for ( var i = 0 ;i < readyList.length;i ++ ){
14 readyList[i].apply(document);
15 }
16 readyList = null ;
17 }
18 var bindReady = function (evt){
19 if (isReady) return ;
20 isReady = true ;
21 onDOMReady.call(window);
22 if (document.removeEventListener){
23 document.removeEventListener( " DOMContentLoaded " , bindReady, false );
24 } else if (document.attachEvent){
25 document.detachEvent( " onreadystatechange " , bindReady);
26 if (window == window.top){
27 clearInterval(timer);
28 timer = null ;
29 }
30 }
31 };
32 if (document.addEventListener){
33 document.addEventListener( " DOMContentLoaded " , bindReady, false );
34 } else if (document.attachEvent){
35 document.attachEvent( " onreadystatechange " , function (){
36 if (( / loaded|complete / ).test(document.readyState))
37 bindReady();
38 });
39 if (window == window.top){
40 timer = setInterval( function (){
41 try {
42 isReady || document.documentElement.doScroll( ' left ' ); // 在IE下用能否执行doScroll判断 dom是否加载完毕
43 } catch (e){
44 return ;
45 }
46 bindReady();
47 }, 5 );
48 }
49 }
50 })();

 

使用方法如下:

 
  
ready(dosomething); // dosomething为已存在的函数
//
也可以通过闭包来使用
ready( function (){
// 这里是逻辑代码
});

 

转载于:https://www.cnblogs.com/yaojaa/archive/2010/12/13/1904214.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值