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