首頁 >web前端 >js教程 >模擬jQuery中的ready方法及實作按需載入css,js實例程式碼_jquery

模擬jQuery中的ready方法及實作按需載入css,js實例程式碼_jquery

WBOY
WBOY原創
2016-05-16 17:21:121118瀏覽
一、ready函數的實作
常用jQuery類別庫或其他類別庫中的ready方法,有時候想想它們到底是怎麼實現的,但是看了一下jQuery中的源碼,牽涉到的模組比較多,(水平有限)程式碼比較難看懂;自己結合了一些書籍內容,總結一下。
先說一下ready函數的實現思路:
變數ready透過表達式賦值,右側為一個自執行匿名函數,在這個匿名函數中,首先為各個瀏覽器的事件綁定處理函數,並為isReady賦值(根據事件非同步處理程序來決定),然後回傳一個傳參閉包,在閉包中,主要判斷isReady值來執行操作,如果dom結構準備就緒(isReady === true),執行回調,否則將回呼加入到要執行的佇列(funs)中,待事件處理程序執行時,迴圈遍歷佇列(funs),並依序執行佇列中的函數,執行完佇列中的函數後,還需要清除佇列(funs = null)。
複製程式碼 程式碼如下:

var ready = (function(>

var ready = (function(){var isReady = false,
    funs = [];
    function handle (e) {
             }
        if ( e.type === ' readystatechange' && (document.readyState !== 'interactive' && document.readyState !== 'complete') ) {
           0; i             funs[i].call(document);
        } ull;
    }
    if ( document.addEventListener ) {
        document.addEventListener( 'DOMContentLoaded', handle, false );
        document.addEventListener( 'readystatechange', hand    document.addEventListener( 'readystatechange', hand. EventListener( 'load', handle, false );
}
    else if ( document.attachEvent ) {
        document.attachEvent( 'onreadystatechange', handle .  }
    return function ready (callback) {
        if ( isReady ) {
           , 🎜>            funs.push(callback);
        }
    };
}());


PS:
此函數程式碼參考於權威指南書籍,唯一不同的是,多加了一個判斷document.readyState !== 'interactive'




複製程式碼


代碼如下:


if ( e.type === 'readystatechange' && document.readyState !== 'interactive' && document.readyState !== 'complete') ) {
    return;二、隨選載入css,js


參考了jQuery來源碼,寫了一個type函數,傳回參數型別。



複製程式碼
程式碼如下:

/**
 *
 * 判斷參數類型
 * createTime: 2013/9/18
 *
 */
函數型別(obj) {
    var classTypes, objectTypes;
   ;
    }
    classTypes = {};
    objectTypes = ('布林數字字串函數陣列日期正規表示式物件錯誤').split(' ');
, len = objectTypes.length; i ) {
        類型.[ '[object ' objectTypes[i] ']' ] = objectTypes[i].to = 'object' || typeof obj === 'function' ) {
        var key = Object.prototype.toString.call(obj);
        return classTypes[key];
    }
    return typeof obj;
}




代碼如下:
>// css補充
function loadCss (cssUrl, callback) {
    var elem, bl,
        isExecuted = falsese>        isExecuted = falsese > null ) {
        return String(cssUrl);
    }
    elem = document.createElement '), 🠎🠎); allback) === 'function' )  {
        bl = true;
    }
    // forie
  | elem.readyState === '已載入' || elem.readyState === '完成' ) {
           if (bl && !isExecuted) {            }
            elem.onreadystatechange = statechange = 句柄;
    // 對於非ie
    if (bl && !isExecuted) {
        elem.onload = 回呼;
        isExecuted = true;
    }  elem.Tagh_c​​opermp. 0].appendChild( elem);
}
// js循環載入
function loadScript(scriptUrl, callback) {
    var elem, bl,
        isExecuted = false; (scriptUrl == null) {
        return String(fn);
    }
    elem = document.createElement('script')         bl = true;
    }
    // 對於ie
    function hand      if (status === '已載入' || status === '完成') {
                 isExecuted = true;
            }
          🎜>        }
    }
    elem.onreadystatechange = 句柄;
   em.onload = 回呼;
        isExecuted = true;
    }
    elem.src = scriptUrl;
    document.getElementsByTagName('head')[0].appendChild(elem);


PS: 在判斷link,script元素是否加載完畢,主要依靠load事件;而在ie9以下瀏覽器中,並沒有load事件,ie為它們都添加了一個readystatechange事件,通過判斷
元素的readyState狀態確定元素是否已經載入完畢;而奇怪的是,在ie9(還可能存在其他瀏覽器版本)中,元素既有load事件又有readystatechange事件,因此在程式碼中加入了一個變數isExecuted,如果執行過回調,那麼就不再執行,避免回調執行兩次。
三、調用方式
複製代碼 代碼如下:

loadCss('http://www.jb51.net/apps/tbtx/miiee/css/base.css', function(){
    console.log('css載入完成') ;
});
loadScript('http://www.jb51.net/apps/tbtx/miiee/js/jQuery.js', function(){
    console.log('js載入完成');
});
ready(function(){
    console.log('dom is ready!');
});
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn