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

首頁 > 編程 > JavaScript > 正文

模擬jQuery中的ready方法及實現按需加載css,js實例代碼

2019-11-20 21:56:16
字體:
來源:轉載
供稿:網友
一、ready函數的實現
經常用jQuery類庫或其他類庫中的ready方法,有時候想想它們到底是怎么實現的,但是看了一下jQuery中的源碼,涉及到的模塊比較多,(水平有限)代碼比較難看懂;自己結合了一些書籍內容,總結一下。
先說一下ready函數的實現思路:
變量ready通過表達式賦值,右側為一個自執行匿名函數,在這個匿名函數中,首先為各個瀏覽器的事件綁定處理函數,并為isReady賦值(根據事件異步處理程序來確定),然后返回一個傳參閉包,在閉包中,主要判斷isReady值來執行操作,如果dom結構準備就緒(isReady === true),執行回調,否則將回調加入到要執行的隊列(funs)中,待事件處理程序執行時,循環遍歷隊列(funs),并依次執行隊列中的函數,執行完隊列中的函數后,還需要清除隊列(funs = null)。
復制代碼 代碼如下:

var ready = (function(){
    var isReady = false,
    funs = [];
    function handle (e) {
        if ( isReady ) {
            return;
        }
        if ( e.type === 'readystatechange' && (document.readyState !== 'interactive' && document.readyState !== 'complete') ) {
            return;
        }
        for ( var i = 0; i < funs.length; i++ ) {
            funs[i].call(document);
        }
        isReady = true;
        funs = null;
    }
    if ( document.addEventListener ) {
        document.addEventListener( 'DOMContentLoaded', handle, false );
        document.addEventListener( 'readystatechange', handle, false );
        document.addEventListener( 'load', handle, false );
    }
    else if ( document.attachEvent ) {
        document.attachEvent( 'onreadystatechange', handle );
        document.attachEvent( 'onload', handle );
    }
    return function ready (callback) {
        if ( isReady ) {
            callback.call(document);
        }
        else {
            funs.push(callback);
        }
    };
}());

PS:
該函數代碼參照于權威指南書籍,唯一不同的是,多加了一個判斷document.readyState !== 'interactive'
復制代碼 代碼如下:

if ( e.type === 'readystatechange' && (document.readyState !== 'interactive' && document.readyState !== 'complete') ) {
    return;
}

在各個瀏覽器中交互和完成狀態出現順序并不能保證一致,這取決于瀏覽器及頁面的內容,多加了這個判斷document.readyState !== 'interactive'的話,
意思是不管哪個階段先出現,代碼都能更早的執行。
二、按需加載css,js
參照了jQuery源碼,寫了一個type函數,返回參數類型。
復制代碼 代碼如下:

/**
 *
 * 判斷參數類型
 * createTime: 2013/9/18
 *
 */
function type (obj) {
    var classTypes, objectTypes;
    if ( obj == null ) {
        return String(obj);
    }
    classTypes = {};
    objectTypes = ('Boolean Number String Function Array Date RegExp Object Error').split(' ');
    for ( var i = 0, len = objectTypes.length; i < len; i++ ) {
        classTypes[ '[object ' + objectTypes[i] + ']' ] = objectTypes[i].toLowerCase();
    }
    if ( typeof obj === '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 = false; // 防止在ie9中,callback執行兩次
    if ( cssUrl == null ) {
        return String(cssUrl);
    }
    elem = document.createElement('link'),
    elem.rel = 'stylesheet';
    if ( type(callback) === 'function' )  {
        bl = true;
    }
    // for ie
    function handle() {
        if ( elem.readyState === 'loaded' || elem.readyState === 'complete' ) {
            if (bl && !isExecuted) {
                callback();
                isExecuted = true;
            }
            elem.onreadystatechange = null;
        }
    }
    elem.onreadystatechange = handle;
    // for 非ie
    if (bl && !isExecuted) {
        elem.onload = callback;
        isExecuted = true;
    }
    elem.href = cssUrl;
    document.getElementsByTagName('head')[0].appendChild(elem);
}
// js按需加載
function loadScript(scriptUrl, callback) {
    var elem, bl,
        isExecuted = false; // 防止在ie9中,callback執行兩次
    if (scriptUrl == null) {
        return String(fn);
    }
    elem = document.createElement('script');
    if ( type(callback) === 'function' )  {
        bl = true;
    }
    // for ie
    function handle(){
        var status = elem.readyState;
        if (status === 'loaded' || status === 'complete') {
            if (bl && !isExecuted) {
                callback();
                isExecuted = true;
            }
            elem.onreadystatechange = null;
        }
    }
    elem.onreadystatechange = handle;
    // for 非ie
    if (bl && !isExecuted) {
        elem.onload = callback;
        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('//www.49028c.com/apps/tbtx/miiee/css/base.css', function(){
    console.log('css加載完畢');
});
loadScript('//www.49028c.com/apps/tbtx/miiee/js/jQuery.js', function(){
    console.log('js加載完畢');
});
ready(function(){
    console.log('dom is ready!');
});
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩中文字幕在线视频| 国产成人自拍视频在线观看| 秋霞成人午夜鲁丝一区二区三区| 国产精品综合网站| 日韩电影大片中文字幕| 一区二区三区视频观看| 日韩中文理论片| 欧美性猛交xxxx乱大交| 国产亚洲精品美女久久久| 亚洲欧美中文在线视频| 欧美一区二区三区精品电影| 亚洲一区999| 日韩国产在线播放| 欧美在线视频免费播放| 最近免费中文字幕视频2019| 久久综合色影院| 疯狂做受xxxx欧美肥白少妇| 日韩av网站大全| 亚洲欧洲国产一区| 久久精品男人天堂| 成人动漫网站在线观看| 国产精品中文字幕在线| 久久久精品国产一区二区| 日韩精品久久久久久久玫瑰园| 日韩最新av在线| 91伊人影院在线播放| 久久久亚洲国产天美传媒修理工| 久久久久久久久亚洲| 国产精品视频一区二区高潮| 欧美激情精品在线| 国产一区玩具在线观看| 亚洲成人黄色在线观看| 国产精自产拍久久久久久| 日本成人黄色片| 中文字幕一区日韩电影| 欧洲成人午夜免费大片| 欧美激情综合色综合啪啪五月| 亚洲天堂网站在线观看视频| 国产视频精品久久久| 久久成年人视频| 日韩一区av在线| 欧美日韩国产91| 成人精品久久av网站| 久久韩国免费视频| 亚洲国产另类 国产精品国产免费| 欧美精品免费在线观看| 成人免费网站在线| 欧美激情一二三| 日韩精品视频在线播放| 日韩成人av网址| 亚洲视频欧洲视频| 最好看的2019的中文字幕视频| 92版电视剧仙鹤神针在线观看| 久久久久久久久久久成人| 成人在线观看视频网站| 久久99久久99精品中文字幕| 久久精品国产69国产精品亚洲| 国产精品久久91| 欧美午夜宅男影院在线观看| 成人免费在线视频网址| 热99精品里视频精品| 91欧美视频网站| 黄色精品一区二区| 国产大片精品免费永久看nba| 国产精品久久久久久久美男| 国产精品美女在线| 亚洲xxxx妇黄裸体| 亚洲精品福利免费在线观看| 成人黄色午夜影院| 欧美精品一区二区三区国产精品| 日产精品久久久一区二区福利| 国产一区二区动漫| 亚洲人成在线观看网站高清| 欧美日韩国产综合新一区| 国内精品伊人久久| 欧美高清不卡在线| 欧美最猛性xxxxx免费| 色中色综合影院手机版在线观看| 2019亚洲男人天堂| 欧美极品少妇xxxxⅹ裸体艺术| 91免费精品视频| 亚洲品质视频自拍网| 日韩免费观看高清| 欧美肥老妇视频| 亚洲一级黄色av| 国产精品国产三级国产专播精品人| 成人午夜在线观看| 国产日韩精品在线播放| 国产激情综合五月久久| 亚洲香蕉成视频在线观看| 精品久久久久久国产| 久久人人爽人人爽人人片av高请| 国产一区二区三区三区在线观看| 欧美日韩美女在线观看| 成人福利视频在线观看| 日韩精品高清在线观看| 一本久久综合亚洲鲁鲁| 国产精品视频自拍| 成人中文字幕在线观看| 最近2019中文免费高清视频观看www99| 亚洲国产成人一区| 亚洲色图第三页| 欧美激情在线播放| 国产精品美乳在线观看| 国产亚洲精品激情久久| 亚洲日本中文字幕| 成人免费看吃奶视频网站| 欧美限制级电影在线观看| 精品亚洲国产成av人片传媒| 国产精品第2页| 成人免费视频在线观看超级碰| 亚洲精品网址在线观看| 国产视频精品一区二区三区| 欧美激情视频在线| 欧美日韩视频在线| 97视频在线观看播放| 91影院在线免费观看视频| 精品视频偷偷看在线观看| 国产在线观看精品| 亚洲欧美视频在线| 国产精品久久视频| 成人日韩在线电影| 国内精品久久久久久影视8| 日韩成人在线网站| 亚洲毛片在线观看| 国产日韩精品一区二区| 亚洲自拍偷拍视频| 亚洲高清av在线| 欧美成aaa人片在线观看蜜臀| 亚洲伊人成综合成人网| 国内精品久久久久久中文字幕| 成人免费在线视频网址| 国产成人精品免高潮费视频| 国产精品电影在线观看| 亚洲人在线视频| 亚洲人成电影网站色…| 国产欧美日韩亚洲精品| 中文字幕日韩精品在线| 精品视频在线播放色网色视频| 欧洲精品毛片网站| 最近中文字幕2019免费| 国产精品久久久久影院日本| 国产亚洲人成网站在线观看| 久久精品国产久精国产一老狼| 亚洲美女自拍视频| 97精品伊人久久久大香线蕉| 中文字幕亚洲无线码在线一区| 欧美体内谢she精2性欧美| 亚洲人成77777在线观看网| 九九热精品视频国产| 中文字幕一区日韩电影| 国产激情久久久久| 在线精品国产成人综合| 亚洲福利视频二区| 色综合伊人色综合网站| 久久久久北条麻妃免费看| 久久久欧美一区二区| 中文字幕亚洲一区| www.久久久久| 欧美日韩国产一区中文午夜| 成人免费福利在线| 国产精品久久久久久久久久久新郎| 一区二区欧美在线| 欧美成人精品一区二区|