封裝DOMContentLoaded事件

m5de 9年前發布 | 971 次閱讀 JavaScript

//保存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執行時已經監聽不到了

</pre>

 本文由用戶 m5de 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!