文档加载执行顺序

<script>
    alert('script1');
    
    $(document).ready(function(){
        alert('$(document).ready()1-1'); 
        $(document).ready(function(){ 
            alert('$(document).ready()1-2'); 
        });
    });
    
    $(window).load(function(){ 
        alert('$(window).load()1'); 
    });
</script>
<script> 
    $(document).ready(function(){ 
        alert('$(document).ready()2-1'); 
        $(document).ready(function(){ 
            alert('$(document).ready()2-2'); 
        }); 
    }); 
    
    alert('script2'); 
    
    $(window).load(function(){ 
        alert('$(window).load()2'); 
    }); 
</script>
<script> 
    alert('script3'); 
    
    document.onreadystatechange = function(){ 
        alert('onreadystatechange:'+document.readyState); 
    }
</script>
<script> 
    window.onload = function(){ 
        alert('window.onloadfunction1'); 
    } 
    
    window.onload = function(){ 
        alert('window.onloadfunction2'); 
    }
    
    function a(){
        alert('a');
    }
    function b(){
        alert('b');
    }
</script>
……
<body οnlοad="a(),b()"> 

 
 
 
 

以上代码在ff下的执行结果:

script1 -> script2 -> script3  ->  onreadystatechange:interactive ->$(document).ready()1-1   -> $(document).ready()2-1  ->$(document).ready()1-2   -> $(document).ready()2-2  -> onreadystatechange:complete ->  $(window).load()1 -> $(window).load()2 -> window.onloadfunction2 -> body-onload -a -> body-onload- b

总结:

1.如果<script>块中有裸代码,会在文档未加载时就首先执行,每个<script>块按代码书写位置顺序执行。

2.裸代码执行完毕后,文档得以加载DOM并形成DOM树,状态发生改变为interactive,jQuery的文档就绪函数$(document).ready()(可简写成$(function(){}))得以执行,有多个并且其内在无ready()嵌套时按书写位置顺序执行,若有嵌套则先按顺序执行外层,外层都执行完毕后从头返回内层按顺序执行。

3.当$(document).ready()全部执行完毕后,文档内的媒体文件接着加载,当所有的内容 ( 包括窗口、框架、对象和图像等 )完全加载完毕时,状态变为complete。

4.js的onload()函数在直接赋值代码的情况下:

window.onload = alert('window.onload1');
window.onload = alert('window.onload2');
window.onload = functionname();
 

可以写多个且都会执行,与<script>块中裸代码地位相同都按书写顺序执行;

若赋值函数(写法为以下两种时:window.οnlοad=function(){} 或 window.οnlοad=functionname;(注意函数名不带括号)),则在文档完全加载完后,状态变为complete后执行,且如果有多个onload,只会执行最后一个

<script>
window.onload = function(){
    alert('window.onloadfunction1');
}
window.onload = function(){
    alert('window.onloadfunction2');
}
window.onload = functionname;
</script>
 

若直接在body元素中给onload事件赋值,则只会执行body的onload事件中赋值的函数,可赋值多个函数用 , 或 ; 分隔,按书写顺序执行,输出window.onloadfunction2 -> a -> b :

<script>
window.onload = function(){
    alert('window.onloadfunction1');
}
window.onload = function(){
    alert('window.onloadfunction2');
}

function a(){
    alert('a');
}
function b(){
    alert('b');
}
</script>
……
<body οnlοad="a(),b()"> 
 
 

5.由于在 $(document).ready() 方法内注册的事件,只要 DOM 就绪就会被执行,因此可能此时元素的关联文件未下载完,例如与图片有关的 html 下载完毕,并且已经解析为 DOM 树了,但很有可能图片还没有加载完毕,所以例如图片的高度和宽度这样的属性此时不一定有效。要解决这个问题,可以使用 Jquery 中另一个关于页面加载的方法 $(window).load()方法。此方法会在元素的 onload 事件中绑定一个处理函数,如果处理函数绑定给 window 对象,则会在文档所有内容加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发,$(window).load()函数可以写多个,按书写位置顺序执行。

Jquery 代码如下:
$(window).load(function (){
	// 编写代码
});
等价于 JavaScript 中的:

window.onload = function(){
	// 编写代码
}

6.除了$(window).load()方法,js中也有等效的addLoadEvent()函数:

function addLoadEvent(func){  
  var oldοnlοad=window.onload;  
  if(typeof window.onload!='function'){  
     window.οnlοad=func;    
  }else{  
    window.οnlοad=function(){  
      oldonload();  
      func();    
    }  
  }  
}

function a(){……}
function b(){……}
function c(){……}

addLoadEvent(a);
addLoadEvent(b);
addLoadEvent(c);
相当于:

window.onload = function(){
    a();
    b();
    c();
}
当js文件内部要使用onload事件时,可以使用addLoadEvent()代替,以免当一个文档调用多个写有onload事件的js文件时发生冲突。

7.除了$(window).load()方法,js的addLoadEvent()函数以外,还可以使用事件监听,当某一事件被触发时需要执行某个函数在IE下可用attachEvent,在FF下则要用addEventListener:

if (navigator.userAgent.indexOf("MSIE")>0){//IE中
    window.attachEvent('onload',函数名);//函数名不要带括号
}else{
    window.addEventListener('load',函数名,false);//注意这里的事件不带"on"前缀,第三个参数为在哪一个阶段捕获事件,若为true则是捕获阶段,若为false则是冒泡阶段
}
使用addEventListener()绑定的函数在事件发生后执行,这里要晚于赋值window.onload本身的函数执行


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值