2.jQuery簡單實現get()和eq()和add()和end()方法

来源:https://www.cnblogs.com/lanshanxiao/archive/2020/05/09/12856441.html
-Advertisement-
Play Games

# jQuery選擇元素 - 1.get() 從jQuery對象中獲取某個指定的元素,返回原生的dom對象,所以不能再次鏈式調用jQuery對象的方法,但是可以使用原生的方法,或者再次封裝為jQuery對象 ```js $('demo').get(0). $($('demo').get(0))//再 ...


# jQuery選擇元素 - 1.get() 從jQuery對象中獲取某個指定的元素,返回原生的dom對象,所以不能再次鏈式調用jQuery對象的方法,但是可以使用原生的方法,或者再次封裝為jQuery對象 ```js $('demo').get(0).
$($('demo').get(0))//再次封裝為jQuery對象 ``` - 2.eq() 從jQuery對象中獲取某個指定的元素,返回jQuery對象 ```js $('.demo').eq(0) ```
- 3.find() 在原有的元素中,查找其後代元素,返回jQuery對象
- 4.jQuery對象中包含了一個prevObject屬性,此屬性指向前一個鏈式調用的jQuery對象,第一個指向了$(document) ```js $('.wrapper');//prevObject:$(document) $('.wrapper').find('ul');//prevObject:$('.wrapper') $('.wrapper').find('ul').find('li');//$('.wrapper').find('ul') ```
- 5.filter() 按條件過濾前一個jQuery對象,返回jQuery對象。主要是針對前一個選擇的jQuery對象基礎上,對其進行限制。不能又選擇有限制。 ```js $('.wrapper').find('ul').find('li').filter(':odd');//過濾li為奇數的li並返回
$('.wrapper').find('ul').filter('li:odd');//這種寫法,過濾不到li:odd
$('.wrapper ul li').filter(function(index, ele){     //index:索引; ele:原生dom對象     //return true;//return後的表達式為true,則元素留下來,為false則剔除掉。返回的還是jQuery對象     return index % 2 == 0;//2的倍數保留 }); ```
- 6.not() not()和filter()是相反的,是反選。
- 7.is() 選中的元素有沒有某個條件,返回true和false ```js $('.wrapper').is('span');//判斷$('.wrapper')是否有span元素 ```
- 8.has() 選中的後代元素必須具有某種條件的jQuery對象,返回jQuery對象 ```js $('li').has('ul');//選中li元素,其後代元素中具有ul元素的 ```
- 9.add() 為jQuery對象中添加一些對象 ```js $('.wrapper').add('ul');//在$('.wrapper')中,再次添加$('ul')的對象 ```
- 10.end() 回退到前一個jQuery對象 ```js $('.wrapper').add('ul').end();//將jQuery對象回退到$('.wrapper') ```

## 實現get() 和 eq() 和 add() 和 end()方法 ```js (function () {     //創建一個jQuery構造函數     function jQuery(selector) {         return new jQuery.prototype.init(selector);     }     //為jQuery的原型添加init屬性,所有實例可以使用該屬性     jQuery.prototype.init = function (selector) {         this.length = 0; //為this添加length屬性,並且賦值為0         //選出 dom 並且包裝成jQuery對象返回         //判斷selector是null 和 undefined 和 dom對象 和 id 和 class的情況         if(this == null){//判斷selector是null或undefined             return this;         }if (typeof selector === 'string' && selector.indexOf('.') != -1) { //selector是class的情況             var dom = document.getElementsByClassName(selector.slice(1));         } else if (typeof selector === 'string' && selector.indexOf("#") != -1) { //selector是id的情況             var dom = document.getElementById(selector.slice(1));         }
        if (selector instanceof Element || dom.length === undefined) { //(selector是dom對象) || (selector是id,返回的是一個對象,對象沒有length屬性)             this[0] = dom || selector;//(selector是id) || (selector是dom對象)             this.length++;         } else { //selector是class,返回的是一個類數組             for (var i = 0; i < dom.length; i++) {                 this[i] = dom[i];                 this.length++;             }         }     };
    //為jQuery的原型添加css屬性,所有實例可以使用該屬性     jQuery.prototype.css = function (config) {         for (var i = 0; i < this.length; i++) {             for (var prop in config) {                 this[i].style[prop] = config[prop];             }         }
        return this; //鏈式調用的精髓     };
    //為jQuery對象的prevObject屬性賦值,從而可以使用end()方法     jQuery.prototype.pushStack = function(dom){         //dom是jQuery對象         if(dom.constructor != jQuery){//dom是原生的dom對象             dom = jQuery(dom);//將原生dom對象包裹成jQuery對象         }         dom.prevObject = this;//將
        return dom;     };
    //為jQuery的原型添加get屬性,所有實例可以使用該屬性     jQuery.prototype.get = function (num) {         //num == null 返回數組         //num >= 0 返回this[num]         //num < 0 返回this[length + num]         return (num != null) ? ((num >= 0) ? (this[num]) : (this[num + this.length])) : ([].slice(this, 0));     };
    //為jQuery的原型添加get屬性,所有實例可以使用該屬性     jQuery.prototype.eq = function (num) {         return this.pushStack(this.get(num));//調用jQuery.prototype.get()函數獲取到dom對象,再封裝為jQuery對象並且為jQuery對象添加prevObject屬性     };
    //為jQuery的原型添加add屬性,所有實例可以使用該屬性     jQuery.prototype.add = function (selector) {         var curObj = jQuery(selector);//當前通過add添加的selector選中的jQuery對象         var prevObj = this;//調用add()的jQuery對象         var newObj = jQuery();
        for(var i = 0; i < curObj.length; i++){             newObj[newObj.length++] = curObj[i];         }
        for(var i = 0; i < prevObj.length; i++){             newObj[newObj.length++] = prevObj[i];         }
        this.pushStack(newObj);//為jQuery對象添加prevObject屬性     };
    //為jQuery的原型添加end屬性,所有實例可以使用該屬性     jQuery.prototype.end = function () {         return this.prevObject;//直接返回前一個jQuery對象     };
    //上面的jQuery構造函數是new 一個jQuery.prototype.init對象,     //jQuery.prototype.init對象上沒有jQuery.prototype上的css()方法     //所以添加下麵一句,讓jQuery.prototype.init對象可以調用jQuery.prototype上的css()方法     jQuery.prototype.init.prototype = jQuery.prototype;
    //讓外部可以通過$()或者jQuery()調用     window.$ = window.jQuery = jQuery; }()); ```   以上是markdown格式的筆記   實現jQuery裡面的get()和eq()和add()和end()方法:
(function () {
    //創建一個jQuery構造函數
    function jQuery(selector) {
        return new jQuery.prototype.init(selector);
    }
    //為jQuery的原型添加init屬性,所有實例可以使用該屬性
    jQuery.prototype.init = function (selector) {
        this.length = 0; //為this添加length屬性,並且賦值為0
        //選出 dom 並且包裝成jQuery對象返回
        //判斷selector是null 和 undefined 和 dom對象 和 id 和 class的情況
        if(selector == null){//判斷selector是null或undefined
            return this;
        }else if (typeof selector === 'string' && selector.indexOf('.') != -1) { //selector是class的情況
            var dom = document.getElementsByClassName(selector.slice(1));
        } else if (typeof selector === 'string' && selector.indexOf("#") != -1) { //selector是id的情況
            var dom = document.getElementById(selector.slice(1));
        }

        if (selector instanceof Element || dom.length == undefined) { //(selector是dom對象) || (selector是id,返回的是一個對象,對象沒有length屬性)
            this[0] = dom || selector;//(selector是id) || (selector是dom對象)
            this.length++;
        } else { //selector是class,返回的是一個類數組
            for (var i = 0; i < dom.length; i++) {
                this[i] = dom[i];
                this.length++;
            }
        }
    };

    //為jQuery的原型添加css屬性,所有實例可以使用該屬性
    jQuery.prototype.css = function (config) {
        for (var i = 0; i < this.length; i++) {
            for (var prop in config) {
                this[i].style[prop] = config[prop];
            }
        }

        return this; //鏈式調用的精髓
    };

    //為jQuery對象的prevObject屬性賦值,從而可以使用end()方法
    jQuery.prototype.pushStack = function(dom){
        //dom是jQuery對象
        if(dom.constructor != jQuery){//dom是原生的dom對象
            dom = jQuery(dom);//將原生dom對象包裹成jQuery對象
        }
        dom.prevObject = this;//

        return dom;
    };

    //為jQuery的原型添加get屬性,所有實例可以使用該屬性
    jQuery.prototype.get = function (num) {
        //num == null 返回數組
        //num >= 0 返回this[num]
        //num < 0 返回this[length + num]
        return (num != null) ? ((num >= 0) ? (this[num]) : (this[num + this.length])) : ([].slice(this, 0));
    };

    //為jQuery的原型添加get屬性,所有實例可以使用該屬性
    jQuery.prototype.eq = function (num) {
        return this.pushStack(this.get(num));//調用jQuery.prototype.get()函數獲取到dom對象,再封裝為jQuery對象並且為jQuery對象添加prevObject屬性
    };

    //為jQuery的原型添加add屬性,所有實例可以使用該屬性
    jQuery.prototype.add = function (selector) {
        var curObj = jQuery(selector);//當前通過add添加的selector選中的jQuery對象
        var prevObj = this;//調用add()的jQuery對象
        var newObj = jQuery();

        for(var i = 0; i < curObj.length; i++){
            newObj[newObj.length++] = curObj[i];
        }

        for(var i = 0; i < prevObj.length; i++){
            newObj[newObj.length++] = prevObj[i];
        }

        this.pushStack(newObj);//為jQuery對象添加prevObject屬性
        
        return newObj;//將合併後的jQuery對象返回
    };

    //為jQuery的原型添加end屬性,所有實例可以使用該屬性
    jQuery.prototype.end = function () {
        return this.prevObject;//直接返回前一個jQuery對象
    };

    //上面的jQuery構造函數是new 一個jQuery.prototype.init對象,
    //jQuery.prototype.init對象上沒有jQuery.prototype上的css()方法
    //所以添加下麵一句,讓jQuery.prototype.init對象可以調用jQuery.prototype上的css()方法
    jQuery.prototype.init.prototype = jQuery.prototype;

    //讓外部可以通過$()或者jQuery()調用
    window.$ = window.jQuery = jQuery;
}());
myJquery.js 調用get()和eq()和add()和end()方法:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <div id="wrapper">1</div>
    <div class="demo">2</div>
    <div class="demo">3</div>
    <div class="container">
        <div>4</div>
        <div class="demo">5</div>
        <div class="demo">6</div>
        <div>7</div>
    </div>
    <script src="./myJquery.js"></script>
    <script>
        console.log($(".demo").get(0));
        console.log($(".demo").eq(0));
        console.log($('.container').add('.demo'));
        console.log($('.container').add('.demo').end());
        $('.container').add('.demo').css({width:'100px',height:'20px',background:'yellow'});
    </script>
</body>

</html>
index.html 效果展示:

 

 

 

 

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摸清數據產生量如何,如果是1鈔鐘1條記錄,則一臺車一天就有86400條記錄,則建議如下: 1、每臺車使用單獨的表,程式內部使用CreateTable,動態創建表,銷毀表。這樣車與車之間不會產生聯繫。 前提:系統管理的車應該不會經常變來變去,沒有很多關聯查詢出多臺車軌跡的需求。 2、建立當前表、歷史表 ...
  • 表結構 student(StuId,StuName,StuAge,StuSex) 學生表 teacher(TId,Tname) 教師表 course(CId,Cname,C_TId) 課程表 sc(SId,S_CId,Score) 成績表 問題七:查詢學過“葉平”老師所教的所有課的同學的學號、姓名 ...
  • val rdd3 = sc.parallelize(List("12","23","345","4567"),2) rdd3.aggregate("")((x,y) => math.max(x.length, y.length).toString, (x,y) => x + y) 兩個分區先計算出字 ...
  • 一、先上成型之後的圖 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="CSS/base.css"> <link rel=" ...
  • 基本數據類型,拷貝是直接拷貝變數的值,而引用類型拷貝的其實是變數的地址而淺拷貝和深拷貝就是在這個基礎之上做的區分,如果在拷貝這個對象的時候,只對基本數據類型進行了拷貝,而對引用數據類型只是進行了引用的傳遞,而沒有重新創建一個新的對象,則認為是淺拷貝。反之,在對引用數據類型進行拷貝的時候,創建了一個新 ...
  • 前言 在看書的過程中,發現有一些內容屬於那種邊邊角角容易忘記卻又非常重要。 所以,在這裡留下一篇筆記,以便查閱。 第1章 js簡介 js組成部分:ECMAScript、DOM、BOM 瀏覽器就是js的解釋器。 DOM是文檔對象模型,通過它來操作網頁對象上的元素,這些元素就是HTML上的各種標簽。 B ...
  • 父級元素包含幾個行內元素 <div id="box"> <p> <span>按鈕</span> <span>測試文字文字文字測試文字文字文字</span> <span>看這裡</span> </p> </div> #box p{ width: 800px; font-size: 30px; } #b ...
  • Angular, one of the most popular software development instruments and it is a part of the Javascript ecosystem. It was introduced by Google in the yea ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...