zoukankan      html  css  js  c++  java
  • 提取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(){
    //这里是逻辑代码
    });

  • 相关阅读:
    html 3
    html标签2
    html标签
    2017.4.27
    2017.4.26
    2017.4.25
    2017.4.20
    2017.1.18
    2017.4.17
    2017.4.16.
  • 原文地址:https://www.cnblogs.com/yaojaa/p/1904214.html
Copyright © 2011-2022 走看看