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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...