亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript封裝DOMContentLoaded事件實例

2019-11-20 14:29:46
字體:
來源:轉載
供稿:網友

最近在寫一個Javascript的框架,剛把DOMContentLoaded事件封裝好,略帶小興奮,把開發過程中遇到的原理和兼容性問題做篇筆記,省的忘記到處找。

我們在寫js代碼的時候,一般都會添加window.onload事件,主要是為了在DOM加載完后可以使用getElementById,getElementsByTagName等方法選取DOM元素進行操作,但是window.load會等到加載完DOM、腳本、CSS,最后加載完圖片甚至是iframe中的所有資源才會觸發,很多時候網頁的圖片較多較大,要等最后圖片這個耗時大戶加載完才執行js明顯有些太遲了,很多時候都會影響用戶體驗。

很多js框架都有個document.ready的功能,像JQuery的$(document).ready()方法,可以在DOM加載完就立即執行js代碼,讓圖片自個慢慢加載吧。

document.ready的核心是DOMContentLoaded事件,firefox、chrome、opera、safari、ie9+都可以使用addEventListener(‘DOMContentLoaded',fn,false)進行事件綁定,而ie6~8不支持DOMContentLoaded事件,所以要針對ie6~8做兼容性處理。

資料上說ie6~8可以使用document.onreadystatechange事件監聽document.readyState狀態是否等于complete來判斷DOM是否加載完畢,如果頁面中嵌有iframe的話,ie6~8的document.readyState會等到iframe中的所有資源加載完才會變成complete,此時iframe變成了耗時大戶。但是經過測試,即使頁面中沒有iframe,當readyState等于complete時,實際觸發的是onload事件而不是DOMContentLoaded事件,對這點表示驚奇。

還好ie有個特有的doScroll方法,當頁面DOM未加載完成時,調用doScroll方法時,就會報錯,反過來,只要一直間隔調用doScroll直到不報錯,那就表示頁面DOM加載完畢了,不管圖片和iframe中的內容是否加載完畢,此法都有效。

如果有多個js文件綁定了document.ready事件,為了防止瀏覽器重復綁定,同時有序執行,可以引入一個事件隊列機制來解決。

以上就是document.ready事件的原理和兼容性問題,下面貼段實例代碼,為了方便理解執行過程,使用函數封裝的模式,執行過程都寫在注釋里了,如果有不妥之處歡迎指教。

復制代碼 代碼如下:

//保存domReady的事件隊列
eventQueue = [];

//判斷DOM是否加載完畢
isReady = false;

//判斷DOMReady是否綁定
isBind = false;

/*執行domReady()
 *
 *@param    {function}
 *@execute  將事件處理程序壓入事件隊列,并綁定DOMContentLoaded
 *          如果DOM加載已經完成,則立即執行
 *@caller
 */
function domReady(fn){
    if (isReady) {
        fn.call(window);
    }
    else{
        eventQueue.push(fn);
    };

    bindReady();
};

/*domReady事件綁定
 *
 *@param    null
 *@execute  現代瀏覽器通過addEvListener綁定DOMContentLoaded,包括ie9+
            ie6-8通過判斷doScroll判斷DOM是否加載完畢
 *@caller   domReady()
 */
function bindReady(){
    if (isReady) return;
    if (isBind) return;
    isBind = true;

    if (window.addEventListener) {
        document.addEventListener('DOMContentLoaded',execFn,false);
    }
    else if (window.attachEvent) {
        doScroll();
    };
};

/*doScroll判斷ie6-8的DOM是否加載完成
 *
 *@param    null
 *@execute  doScroll判斷DOM是否加載完成
 *@caller   bindReady()
 */
function doScroll(){
    try{
        document.documentElement.doScroll('left');
    }
    catch(error){
        return setTimeout(doScroll,20);
    };
    execFn();
};

/*執行事件隊列
 *
 *@param    null
 *@execute  循環執行隊列中的事件處理程序
 *@caller   bindReady()
 */
function execFn(){
    if (!isReady) {
        isReady = true;
        for (var i = 0; i < eventQueue.length; i++) {
            eventQueue[i].call(window);
        };
        eventQueue = [];
    };
};

//js文件1
domReady(function(){
    ...
});
//js文件2
domReady(function(){
    ...
});

//注意,如果是異步加載的js就不要綁定domReady方法,不然函數不會執行,
//因為異步加載的js下載之前,DOMContentLoaded已經觸發,addEventListener執行時已經監聽不到了

測試頁面:都加載了兩張很大的圖片,onload需要圖片加載完才能執行js,DOMContentLoaded只需等到DOM加載完即可執行js。可以打開firebug查看加載過程,每次測試前記得先清理下瀏覽器緩存。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩美女av在线免费观看| 中文字幕日韩免费视频| 欧美另类极品videosbest最新版本| 日韩欧美在线视频观看| 7777kkkk成人观看| 欧美日韩综合视频网址| 日韩电影中文字幕一区| 成人亚洲综合色就1024| 欧美精品福利在线| 菠萝蜜影院一区二区免费| 亚洲精品久久久久久久久久久久| 欧洲日韩成人av| 日韩视频第一页| 亚洲男人第一av网站| 在线观看免费高清视频97| 国产精品扒开腿爽爽爽视频| 欧美精品激情视频| 久久久久久久久久av| 国产精品伦子伦免费视频| 日韩国产在线看| 中文亚洲视频在线| 久久久亚洲福利精品午夜| 久久久久北条麻妃免费看| 国产精品一区久久久| 亚洲乱码国产乱码精品精| 久久久久日韩精品久久久男男| 久久久久久高潮国产精品视| 国产福利精品av综合导导航| 成人黄色免费在线观看| 色琪琪综合男人的天堂aⅴ视频| 丝袜亚洲另类欧美重口| 久久久久久久97| 久久精品美女视频网站| 久久韩国免费视频| 色先锋资源久久综合5566| 国产日韩欧美在线播放| 丁香五六月婷婷久久激情| 欧美人与性动交| 91欧美精品成人综合在线观看| 亚洲xxxx3d| 中文国产成人精品久久一| 26uuu另类亚洲欧美日本老年| 欧美中文字幕在线播放| 欧美日韩国产综合新一区| 色偷偷亚洲男人天堂| 91精品啪在线观看麻豆免费| 欧美性理论片在线观看片免费| 青青在线视频一区二区三区| 中文字幕精品av| 俺也去精品视频在线观看| 久久久亚洲国产天美传媒修理工| 少妇激情综合网| 日韩av观看网址| 亚洲精品按摩视频| 色综合色综合网色综合| 成人免费看片视频| 亚洲欧美日韩天堂一区二区| 亚洲自拍偷拍网址| 国产一区二区三区视频在线观看| 亚洲精品99999| 亚洲综合视频1区| 91在线高清视频| 色综合久久久久久中文网| 国产原创欧美精品| 国产精品欧美日韩久久| 性欧美亚洲xxxx乳在线观看| 亚洲日韩欧美视频一区| 国产精品欧美激情在线播放| 欧美黑人国产人伦爽爽爽| 亚洲综合一区二区不卡| 5566日本婷婷色中文字幕97| 欧美乱大交做爰xxxⅹ性3| 久久综合色88| 国产成人极品视频| 亚洲国产中文字幕久久网| 久久久久久美女| 456亚洲影院| 日韩美女视频中文字幕| 欧美成人小视频| 亚洲综合第一页| 亚洲人成网在线播放| 一本大道久久加勒比香蕉| 中文字幕日韩精品有码视频| 亚洲成人精品视频| 欧美精品亚州精品| 亚洲高清一二三区| 国产91精品久久久久久| 久久夜色精品国产欧美乱| 日韩在线观看精品| 777国产偷窥盗摄精品视频| 亚洲永久免费观看| 日韩暖暖在线视频| 这里只有视频精品| 日韩欧美高清视频| …久久精品99久久香蕉国产| 国产精品视频地址| 中文字幕av一区| 成人深夜直播免费观看| 欧美老女人在线视频| xvideos国产精品| 91精品久久久久久久久久久久久| 97视频色精品| 亚洲码在线观看| 98视频在线噜噜噜国产| 亚洲国产精品一区二区久| 国产精品精品久久久| 中文字幕日韩精品在线观看| 欧美国产日韩精品| 国产主播在线一区| 欧美亚洲另类在线| 美女999久久久精品视频| 久久久噜久噜久久综合| 国产小视频91| 色妞在线综合亚洲欧美| 第一福利永久视频精品| 一区二区日韩精品| www高清在线视频日韩欧美| 日韩欧美在线中文字幕| 久久久久久国产精品久久| 日韩av有码在线| 91亚洲国产成人久久精品网站| 成人精品久久av网站| 96pao国产成视频永久免费| 日韩电影在线观看免费| 国产色婷婷国产综合在线理论片a| 九九热最新视频//这里只有精品| 欧美一级免费看| 91精品国产高清久久久久久| 亚洲国内高清视频| 裸体女人亚洲精品一区| 久久久久久伊人| 色爱精品视频一区| 色中色综合影院手机版在线观看| 欧美视频在线观看免费| 欧美午夜久久久| 精品久久久久人成| 在线日韩第一页| 欧美亚洲日本网站| 91精品国产91久久| 日韩在线观看成人| 国产精品久久色| 久久精品91久久久久久再现| 91精品国产高清久久久久久| 一区二区欧美在线| 日韩欧美aⅴ综合网站发布| 欧美午夜激情在线| 欧美高清理论片| 亚洲精品国产精品国自产在线| 日韩免费在线电影| 欧美成人小视频| 欧美大全免费观看电视剧大泉洋| 日韩精品在线看| 久久久视频精品| 九色精品免费永久在线| 亚洲人成在线观看| 久久精品国产v日韩v亚洲| 久久精品在线视频| 色中色综合影院手机版在线观看| www国产精品com| 久久久久一本一区二区青青蜜月| 丰满岳妇乱一区二区三区| 日韩电影在线观看中文字幕| 中文字幕精品在线视频| 亚洲自拍偷拍第一页|