jQuery 源碼解析(七) jQuery對象和DOM對象的互相轉換

来源:https://www.cnblogs.com/greatdesert/archive/2019/09/02/11428986.html
-Advertisement-
Play Games

jQuery對象是一個類數組對象,它保存的是對應的DOM的引用,我們可以直接用[]獲取某個索引內的DOM節點,也可以用get方法獲取某個索引內的DOM節點,還可以用toArray()方法把jQuery對象一次性轉換成一個數組,例如: 將DOM對象轉換為jQuery對象就更方便了,直接放到jQuery ...


jQuery對象是一個類數組對象,它保存的是對應的DOM的引用,我們可以直接用[]獲取某個索引內的DOM節點,也可以用get方法獲取某個索引內的DOM節點,還可以用toArray()方法把jQuery對象一次性轉換成一個數組,例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    <script>
        var jObject = $('p');
        console.log(jObject[0].innerHTML)            //輸出:1
        console.log(jObject[1].innerHTML)            //輸出:2
        console.log(jObject.get(2).innerHTML)        //輸出:3
        console.log(jObject.toArray())               //輸出:Array(3) [ p, p, p ]     ;每個元素都是一個DOM節點,等於對應的p元素
    </script>
</body>
</html>

將DOM對象轉換為jQuery對象就更方便了,直接放到jQuery的構造器內即可,如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    <script>
        var p         =     document.getElementsByTagName('p'),        
            result    =    [];                                        
        for(let i = 0;i<p.length;i++)        result.push(i)        //getElementsByTagName獲取的是HTMLCollection對象,也是個類數組,我們把它轉換為數組格式

        console.log( $(p) instanceof $ )                        //輸出true        ;表示$(p)是一個jQuery對象
        console.log( $(p).size() )                              //輸出:3            ;因為p內有3個DOM元素

        console.log( $(p[0]) instanceof $ )                     //輸出true        ;表示$(p)是一個jQuery對象
        console.log( $(p[0]).size() )                           //輸出:1            ;因為我們只傳入一個p[0],只有一個DOM節點
    </script>
</body>
</html>

輸出如下:

原因在代碼里註釋得挺詳細了,嗯,就這樣

 

源碼分析

writer by:大沙漠 QQ:22969969


 DOM轉換成jQuery對象都是在jQuery內部的init()函數內實現的,如下:

init: function( selector, context, rootjQuery ) {
  /**/
  // Handle $(DOMElement)
  if ( selector.nodeType ) {                  //selector有屬性nodeType,則認為selector是DOM元素,例如:$(document.getELementById('d'))
    this.context = this[0] = selector;            //保存該DOM節點的引用
    this.length = 1;                              //設置length屬性為1
    return this;                                  //返回this,以支持鏈式操作
  }

  /**/

  return jQuery.makeArray( selector, this );  //這裡是最後的邏輯,如果selector是數組或偽數組
},

makeArray是jQuery內部的一個函數,用於把一個類數組轉換成真正的數據,如下:

  makeArray: function( array, results ) {     //將一個類數組對象轉換為真正的數組
    var ret = results || [];                    //如果results不存在則修正為空數組,初始化jQuery執行到這裡時這裡的result等於jQuery對象,也就是上面傳進來的this

    if ( array != null ) {                      //過濾參數array是null、undefined的情況。
      // The window, strings (and functions) also have 'length'
      // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
      var type = jQuery.type( array );

      if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {    //如果array沒有屬性length 或者 參數array是字元串,或者是函數,或者是正則,或者是Window對象
        push.call( ret, array );                                                                                                        //認為參數array不是數組,也不是類數組對象,調用數組方法push()把該參數插入返回值ret的末尾。
      } else {
        jQuery.merge( ret, array );           //否則認為參數array是數組或類數組對象,調用方法jQuery.merge()把該參數合併到返回值ret中
      }
    }

    return ret;
  },

最後返回該數組,因為我們在第二個參數傳遞了this,因此makeArray最後會返回this

對於jQuery對象轉換為DOM對象來說,由於jQuery本身就是個類數組對象,因此,我們可以直接用[]獲取索引,對於get和toArray方法來說,這些操作定義在jQuery的原型上,也就是jQuery.fn上的,如下:

jQuery.fn = jQuery.prototype = {  //重寫jQueyr.fn
  /**/
  toArray: function() {               //將當前jQuery對象轉換為真正的數組,轉換後的數組包含了所有元素。
    return slice.call( this, 0 );
  },
  get: function( num ) {              //返回當前jQuery 對象中指定位置的元素或包含了全部元素的數組,
    return num == null ?

      // Return a 'clean' array
      this.toArray() :

      // Return just the object
      ( num < 0 ? this[ this.length + num ] : this[ num ] );      //直接返回this[num],也就是和我們用[]是一樣的,只是封裝了一下
  },
  /**/
}

我們可以看到對於get來說,就是直接從this[]上獲取的,而toArray則調用了數組了slice方法,將類數組轉換成真實的數組


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

-Advertisement-
Play Games
更多相關文章
  • 先上圖 功能: 1、上拉日曆摺疊,展示周 2、左右滑動切換月 2、“今天”回到今天;“+”添加日程 3、localStorage存儲日程 index,html <body> <div id="app" v-cloak @mousedown="down" @mouseup="heightChange" ...
  • ![知識點彙總知識圖譜](https://img2018.cnblogs.com/blog/1512305/201909/1512305-20190902114509974-1787421746.png) ...
  • const portfinder = require('portfinder'); const port = await portfinder.getPortPromise(); 兩行代碼 埠搜索範圍 預設情況下,portfinder將開始搜索8000並掃描,直到達到最大埠號(65535) 源碼 ...
  • JS一個重要功能就是操作DOM, 改變頁面顯示。 目錄: 1、基本概念 2、節點類型 3、節點關係 4、節點操作 基本概念 DOM全稱為Document Object Model ,即文檔對象模型,是針對HTML和XML的一個API, 描繪了一個層次化的節點樹,可以添加、移除和修改頁面的某一部分。 ...
  • 雲計算和移動計算令已經很脆弱的身份及訪問管理(IAM)基礎設施更加搖搖欲墜。問題的日益嚴重推動單點登錄、多因數身份驗證、IAM集中化等領域出現相應變革。 " " 幾年前,CISO們就感受到了雲計算和移動計算時代維持安全控制的艱難。隨著雲計算和移動計算的興起,身份和數據安全已經變成了新的安全邊界,企業 ...
  • 雲已經改變了我們工作的方式,且在不遠的將來,這一動作仍將持續。在雲為員工提供各種便利,為公司企業帶來成本節約、價值提升、工序縮減等收益的同時,新的挑戰也隨之而來。Gartner預測,到2020年, 90% 的企業都將管理 由雲和內部解決方案組成的混合IT基礎設施 ,這無疑會使得安全挑戰和困難變得更加 ...
  • JS數組的方法眾多,平時在使用的時候,容易忘記某些不常用的數組方法,而且時長把兩個差不多的方法搞混。而且ES6在ES5的基礎上又新增了一些方法,為了方便記憶,就寫篇博客方便記憶,沒事的時候拿出來看看。 數組方法: 1.push() 用法:在數組的最後一位添加數據,同時返回插入後的數組長度。 var ...
  • RxJS 的操作符(operators)是最有用的,儘管 Observable 是最基本的。操作符最基本的部分(pieces)就是以申明的方式允許複雜的非同步代碼組合簡化。 什麼是操作符? 操作符是函數。這裡有兩種操作符: 管道操作符(Pipeable Operators)是可以通過使用 管道傳輸到 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...