国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

原生JS實現DOM加載完成馬上執行JS代碼的方法

2024-05-06 16:45:57
字體:
來源:轉載
供稿:網友

用原生JS我們經常使用window.onload事件來加載頁面。但是window.onload是在頁面元素都加載完畢后才執行,如果頁面內有大的圖片的話,會在頁面展現后好久時間后才執行。所以有時我們需要在DOM載入時馬上執行一些函數。jQuery提供了document.ready方法用來代替window.onload。但又不愿意僅為了這一個需求而引入整個JQuery庫,于是就把jQuery的方法提取出來,單獨使用了。

如果只需要對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事件,另外也可以在構建自己的框架時使用此函數。

(function(){  var isReady=false; //判斷onDOMReady方法是否已經被執行過  var readyList= [];//把需要執行的方法先暫存在這個數組里  var timer;//定時器句柄   ready=function(fn)  {   if (isReady )    fn.call( document);   else    readyList.push( function() { return fn.call(this);});   return this;  }   var onDOMReady=function(){   for(var i=0;i< readyList.length;i++)   {    readyList[i].apply(document);   }   readyList = null;  }   var bindReady = function(evt)  {   if(isReady) return;   isReady=true;   onDOMReady.call(window);   if(document.removeEventListener)   {    document.removeEventListener("DOMContentLoaded", bindReady, false);   }   else if(document.attachEvent)   {    document.detachEvent("onreadystatechange", bindReady);    if(window == window.top){     clearInterval(timer);//事件發生后清除定時器     timer = null;    }   }  };   if(document.addEventListener){   document.addEventListener("DOMContentLoaded", bindReady, false);  }  else if(document.attachEvent)//非最頂級父窗口   {   document.attachEvent("onreadystatechange", function(){    if((/loaded|complete/).test(document.readyState))    bindReady();   });   if(window == window.top)//在應用有frameset或者iframe的頁面時,parent是父窗口,top是最頂級父窗口(有的窗口中套了好幾層frameset或者iframe)  {   timer = setInterval(function(){    try    {     isReady||document.documentElement.doScroll('left');//在IE下用能否執行doScroll判斷 dom是否加載完畢    }    catch(e)    {     return;    }    bindReady();   },5);  }  } })();

下面是使用方法:

 ready(dosomething);//dosomething為已存在的函數 //也可以通過閉包來使用 ready(function(){  //這里是邏輯代碼 });

以上這篇原生JS實現DOM加載完成馬上執行JS代碼的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昭觉县| 新野县| 吴忠市| 治多县| 顺昌县| 绥芬河市| 梅河口市| 大悟县| 璧山县| 西宁市| 广水市| 广宁县| 镇坪县| 三穗县| 富民县| 库车县| 莒南县| 阿尔山市| 翁牛特旗| 昌宁县| 武宣县| 九龙县| 张家界市| 西宁市| 密云县| 五华县| 通江县| 台北市| 开阳县| 永寿县| 城固县| 抚松县| 安溪县| 张家港市| 禹州市| 景谷| 全椒县| 大竹县| 和林格尔县| 东乡族自治县| 石棉县|