HTMLCollection 和 Nodelist 的異同?

来源:https://www.cnblogs.com/jaycethanks/archive/2023/02/16/17125951.html
-Advertisement-
Play Games

HTMLCollection 和 Nodelist 的異同? 1. w3 關於這兩者的定義 HTMLCollection: An HTMLCollection is a list of nodes. An individual node may be accessed by either ordin ...


HTMLCollection 和 Nodelist 的異同?

1. w3 關於這兩者的定義

HTMLCollection: An HTMLCollection is a list of nodes. An individual node may be accessed by either ordinal index or the node's name or id attributes. Note: Collections in the HTML DOM are assumed to be live meaning that they are automatically updated when the underlying document is changed.

NodeList: The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.

The items in the NodeList are accessible via an integral index, starting from 0.

HTMLCollectionNodeList 都是元素節點的集合, 前者可以按照索引/節點name/節點id 屬性訪問。 後者可以按照索引訪問。

1.1 實例屬性

HTMLCollectionNodeList 都只有一個實例屬性:

  • length: 返回節點集合的長度

1.2 實例方法

HTMLCollection NodeList
HTMLCollection.item()
傳入元素 index 返回特定的節點
NodeList.item()
傳入索引返回特定節點
HTMLCollection.namedItem()
傳入節點的 name 屬性,返回特定的節點
NodeList.entries()
返回key-value 的迭代器
⚠️HTMLCollection 沒有 forEach 方法 NodeList.forEach()
節點遍歷方法
NodeList.keys()
返回NodeList 的所有key值的迭代器,這裡也就是索引
NodeList.values()
返回NodeList 的所有value值的迭代器,也就四節點本身

一些示例:

  <body>
    <p name="p1" class="para">Lorem, ipsum dolor.</p>
    <p name="p2" class="para">Lorem ipsum dolor sit amet.</p>
    <p name="p3" class="para">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
  </body>
  <script>
    const paras = document.getElementsByClassName('para');
    console.log(paras.item(0).innerHTML);//Lorem, ipsum dolor.
    console.log(paras.namedItem('p3').innerHTML);//Lorem ipsum dolor sit amet, consectetur adipisicing elit.
  </script>
  <body>
    <p name="p1" class="para">Lorem, ipsum dolor.</p>
    <p name="p2" class="para">Lorem ipsum dolor sit amet.</p>
    <p name="p3" class="para">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
  </body>
  <script>
    const paras = document.querySelectorAll('.para');
    console.log('log1:', paras.item(0).innerHTML);
    console.log('log2:', paras.entries());
    console.log('log3:', paras.entries().next());
    console.log('log4:', paras.keys());
    console.log('log5:', paras.keys().next());
    console.log('log6:', paras.values());
    console.log('log7:', paras.values().next());
    paras.forEach((p) => {
      console.log('[p.innerHTML]: ', p.innerHTML);
    });
  </script>

image

特別說明,在實例方法中, NodeList/HTMLCollection.item()方法僅接受索引值。

2. 哪些常見操作會返回這二者?

HTMLCollection

  • document.getElementsByTagName

  • document.getElementsByClassName

  • HTMLElement.children

  • document.forms

  • document.images

NodeList:

  • document.getElementsByName
  • document.querySelectorAll
  • HTMLElement.childNodes

3. 二者有什麼相同點?

二者所包含的結點都是響應式的,也就是說,當所依賴的文檔發生了變化,相應的DOM視圖也會發生更新。

NodeList

為了驗證這一點,我們可以使用 Array.from(淺拷貝來測試一下):

  <script>
    const paras = document.querySelectorAll('.para');
    const copy = Array.from(paras);
    copy.forEach((cp) => {
      cp.innerHTML += new Date().toLocaleTimeString();
    });
    paras.forEach((p) => {
      console.log('[p.innerHTML]: ', p.innerHTML);
    });
      //[p.innerHTML]:  Lorem, ipsum dolor.9:42:54 AM
      //[p.innerHTML]:  Lorem ipsum dolor sit amet.9:42:54 AM
      //[p.innerHTML]:  Lorem ipsum dolor sit amet, consectetur adipisicing 
  </script>

image

說明拷貝對象中的DOM 元素髮生了變化,視圖會發生更新。

HTMLCollection

對於 HTMLCollection 也是這樣的,

  <script>
    const paras = document.getElementsByClassName('para');
    const copy = Array.from(paras);
    copy.forEach((cp) => {
      cp.innerHTML += new Date().toLocaleTimeString();
    });
    [...paras].forEach((p) => {
      console.log('[p.innerHTML]: ', p.innerHTML);
    });
      //[p.innerHTML]:  Lorem, ipsum dolor.9:42:54 AM
      //[p.innerHTML]:  Lorem ipsum dolor sit amet.9:42:54 AM
      //[p.innerHTML]:  Lorem ipsum dolor sit amet, consectetur adipisicing elit.9:42:54 AM
  </script>

需要註意的是,這裡HTMLCollection 類數組是沒有forEach 方法的, 所有我們用擴展元算符(其實也是淺拷貝)將其轉換成了一個數組。

4. 二者有什麼區別?

最重要的區別是, HTMLCollection 僅包含 tags(以及id/name分別標記的) 元素, 而 NodeList 包含所有的節點。 例如:

  • 元素節點

  • 屬性節點

  • 文本節點(空白字元也會被視作文本節點)

  • 註釋節點

    node types

示例:

  <body>
    <ul id="myList">
      <!-- List items -->
      <li name="li-name-01" id="li-id-01">List item 1</li>
      <li name="li-name-02" id="li-id-02">List item 2</li>
      <li name="li-name-03" id="li-id-03">List item 3</li>
      <li name="li-name-04" id="li-id-04">List item 4</li>
      <li name="li-name-05" id="li-id-05">List item 5</li>
    </ul>
  </body>
  <script>
    const ul = document.getElementById('myList');
    console.log('[ul.children]: ', ul.children);
    console.log('[ul.childNodes]: ', ul.childNodes);
  </script>

image

這意味著,對於有id節點的 HTMLCollection 返回類型, 你可以這樣去訪問:

console.log('[li[0]]: ', li[0]); //li#li-01
console.log("[li['li-01']]: ", li['li-01']);//li#li-01

並且這二者完全一樣:

console.log(li[0] === li['li-01']);//true

name 也是如此

另外,儘管如此,HTMLCollection/NodeList 的 item 方法依舊僅能通過索引訪問,而不能夠通過id/name 訪問。

const li = document.getElementsByTagName('li');
const _li = document.querySelectorAll('li');

//以下列印: li#li-03
console.log('[li.item(2)]: ', li.item(2));
console.log('[_li.item(2)]: ', _li.item(2));

//以下列印: li#li-01
console.log('[li.item("")]: ', li.item(''));
console.log('[li.item("li-03")]: ', li.item('li-03'));
console.log('[_li.item("")]: ', _li.item(''));
console.log('[_li.item("li-03")]: ', _li.item('li-03'));

即item參數如果接收一個非數值參數,將預設返回第一個元素,如果沒有元素,那麼返回 null!


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

-Advertisement-
Play Games
更多相關文章
  • pdf下載:密碼7281 專欄目錄首頁:【專欄必讀】(考研覆試)資料庫系統概論第五版(王珊)專欄學習筆記目錄導航及課後習題答案詳解 名詞解釋 視圖:視圖是一個虛表,其本質就是一條SELECT語句,而查詢結果被賦予了一個名字,也即視圖名字。或者說視圖本身不包含任何數據,它只包含映射到基表的一個查詢語句 ...
  • 原文地址:Jetpack Compose學習(10)——使用Compose物料清單BOM,更好管理依賴版本 - Stars-One的雜貨小窩 本期講解下關於Android推出的BOM來簡化我們添加compose依賴過於繁雜的問題 本系列以往文章請查看此分類鏈接Jetpack compose學習 介紹 ...
  • 一、鯨鴻動能流量變現服務前置說明 1.接入鯨鴻動能平臺的應用需在應用市場上架。 2.與華為聯運的游戲應用和快游戲禁止接入鯨鴻動能以外的其他廣告內容/插件/SDK等。 3.中國大陸地區僅支持企業認證用戶使用流量變現服務。 4.支持的設備限制: 5.媒體接入流程: 二、媒體服務平臺 數據管理 【首頁】或 ...
  • 現在有不少項目都轉向使用了pnpm,它能幫我們節約磁碟空間並提升包的安裝速度,但是也沒有帶來很多使用習慣上的遷移,npm中的命令在pnpm中大多都是能用的,我們可以方便的切換到pnpm中進行開發。為何不嘗試一下呢?本文就介紹了pnpm中基本的原理,很常用的命令,讓你方便快速的瞭解並使用它。 ...
  • 很多網站都需要添加暗黑模式,怎麼添加呢,有一種簡單的方式 只需在 css 代碼中添加這麼一句 html[theme="dark-mode"] { filter: invert(1) hue-rotate(180deg); } filter:將模糊或顏色偏移等圖形效果應用於元素。濾鏡通常用於調整圖像, ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前期準備 本篇文章的編寫目的是為了提升TS類型的書寫質量,高質量的類型可以提高項目的可維護性並避免一些潛在的漏洞; 在學習本篇之前需要有一定的TS基礎知識,在此基礎上可以更好的完成各種類型的挑戰,編寫出屬於自己的類型工具; 這裡推薦我之前 ...
  • 其他章節請看: react 高效高質量搭建後臺系統 系列 許可權 本系列已近尾聲,許可權是後臺系統必不可少的一部分,本篇首先分析spug項目中許可權的實現,最後在將許可權加入到我們的項目中來。 spug 中許可權的分析 許可權示例 比如我要將應用發佈模塊的查看許可權分給某用戶(例如 pjl),可以這樣操作: 在角 ...
  • 一、Vue 2 1、父組件向子組件傳值,使用 props:可以通過在子組件上綁定 props,然後在父組件中通過 v-bind 綁定相應的數據來傳遞數據。 父組件中的代碼: <template> <div> <child-component :prop-a="dataA"></child-compo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...