<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 21:14:08
        文檔

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

        模擬jQuery中的ready方法及實現按需加載css,js實例代碼_jquery:一、ready函數的實現經常用jQuery類庫或其他類庫中的ready方法,有時候想想它們到底是怎么實現的,但是看了一下jQuery中的源碼,涉及到的模塊比較多,(水平有限)代碼比較難看懂;自己結合了一些書籍內容,總結一下。先說一下ready函數的實現思路:變量rea
        推薦度:
        導讀模擬jQuery中的ready方法及實現按需加載css,js實例代碼_jquery:一、ready函數的實現經常用jQuery類庫或其他類庫中的ready方法,有時候想想它們到底是怎么實現的,但是看了一下jQuery中的源碼,涉及到的模塊比較多,(水平有限)代碼比較難看懂;自己結合了一些書籍內容,總結一下。先說一下ready函數的實現思路:變量rea

        一、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('http://www.gxlcms.com/apps/tbtx/miiee/css/base.css', function(){
        console.log('css加載完畢');
        });
        loadScript('http://www.gxlcms.com/apps/tbtx/miiee/js/jQuery.js', function(){
        console.log('js加載完畢');
        });
        ready(function(){
        console.log('dom is ready!');
        });

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        模擬jQuery中的ready方法及實現按需加載css,js實例代碼_jquery:一、ready函數的實現經常用jQuery類庫或其他類庫中的ready方法,有時候想想它們到底是怎么實現的,但是看了一下jQuery中的源碼,涉及到的模塊比較多,(水平有限)代碼比較難看懂;自己結合了一些書籍內容,總結一下。先說一下ready函數的實現思路:變量rea
        推薦度:
        標簽: js 實現的 read
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲AV无码国产精品色| 日本免费一区尤物| 国产亚洲综合网曝门系列| WWW亚洲色大成网络.COM| 四虎成人精品一区二区免费网站| 激情综合亚洲色婷婷五月| 亚洲高清免费在线观看| 亚洲麻豆精品果冻传媒| 最近中文字幕mv免费高清在线 | 亚洲av无码一区二区三区乱子伦| 亚洲高清国产拍精品熟女| 在线天堂免费观看.WWW| 午夜一区二区免费视频| 亚洲无人区码一二三码区别图片 | 日本在线免费播放| 亚洲大尺度无码无码专区| 香港a毛片免费观看| 亚洲精品不卡视频| 女人让男人免费桶爽30分钟| 亚洲狠狠婷婷综合久久| www国产亚洲精品久久久| caoporm超免费公开视频| 永久黄色免费网站| 国产成人亚洲综合一区| 四虎在线播放免费永久视频| 日韩免费码中文在线观看| 亚洲AV无码一区东京热久久| 最近免费中文字幕大全免费 | 人人狠狠综合久久亚洲婷婷| 69av免费观看| 亚洲av永久中文无码精品综合| av无码东京热亚洲男人的天堂| 中国一级毛片免费看视频| 在线免费观看a级片| 亚洲精品视频免费观看| 久久青青成人亚洲精品| 午夜免费福利影院| 国产一级在线免费观看| 亚洲娇小性xxxx| 亚洲第一成年免费网站| 成人特级毛片69免费观看|