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

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

May 16, 2016 pm 05:21 PM
css jquery js

一、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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

bootstrap按鈕怎麼用 bootstrap按鈕怎麼用 Apr 07, 2025 pm 03:09 PM

如何使用 Bootstrap 按鈕?引入 Bootstrap CSS創建按鈕元素並添加 Bootstrap 按鈕類添加按鈕文本

bootstrap怎麼插入圖片 bootstrap怎麼插入圖片 Apr 07, 2025 pm 03:30 PM

在 Bootstrap 中插入圖片有以下幾種方法:直接插入圖片,使用 HTML 的 img 標籤。使用 Bootstrap 圖像組件,可以提供響應式圖片和更多樣式。設置圖片大小,使用 img-fluid 類可以使圖片自適應。設置邊框,使用 img-bordered 類。設置圓角,使用 img-rounded 類。設置陰影,使用 shadow 類。調整圖片大小和位置,使用 CSS 樣式。使用背景圖片,使用 background-image CSS 屬性。

bootstrap怎麼調整大小 bootstrap怎麼調整大小 Apr 07, 2025 pm 03:18 PM

要調整 Bootstrap 中元素大小,可以使用尺寸類,具體包括:調整寬度:.col-、.w-、.mw-調整高度:.h-、.min-h-、.max-h-

bootstrap怎麼看日期 bootstrap怎麼看日期 Apr 07, 2025 pm 03:03 PM

答案:可以使用 Bootstrap 的日期選擇器組件在頁面中查看日期。步驟:引入 Bootstrap 框架。在 HTML 中創建日期選擇器輸入框。 Bootstrap 將自動為選擇器添加樣式。使用 JavaScript 獲取選定的日期。

bootstrap怎麼寫分割線 bootstrap怎麼寫分割線 Apr 07, 2025 pm 03:12 PM

創建 Bootstrap 分割線有兩種方法:使用 標籤,可創建水平分割線。使用 CSS border 屬性,可創建自定義樣式的分割線。

bootstrap怎麼設置框架 bootstrap怎麼設置框架 Apr 07, 2025 pm 03:27 PM

要設置 Bootstrap 框架,需要按照以下步驟:1. 通過 CDN 引用 Bootstrap 文件;2. 下載文件並將其託管在自己的服務器上;3. 在 HTML 中包含 Bootstrap 文件;4. 根據需要編譯 Sass/Less;5. 導入定製文件(可選)。設置完成後,即可使用 Bootstrap 的網格系統、組件和样式創建響應式網站和應用程序。

bootstrap日期怎麼驗證 bootstrap日期怎麼驗證 Apr 07, 2025 pm 03:06 PM

在 Bootstrap 中驗證日期,需遵循以下步驟:引入必需的腳本和样式;初始化日期選擇器組件;設置 data-bv-date 屬性以啟用驗證;配置驗證規則(如日期格式、錯誤消息等);集成 Bootstrap 驗證框架,並在表單提交時自動驗證日期輸入。

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

See all articles