DOM常見的操作有哪些?

1.DOM

文檔對象模型(DOM)是HTML和XML文檔的編程接口

它提供了對文檔結構化表述,并定義了一種方式可以使從程序中對該結構進行訪問,從而改變文檔的結構,樣式和內容

任何HTML或XML文檔都可以用DOM表示一個由節點構成的層級結構

節點分很多類型,每種類型對應著文檔中不同的信息和(或)標記,也都有自己不同的特性、數據和方法,而且與其他類型有某種關系,如下所示:

<html><head><title>Page</title></head><body><p>Hello World!</p ></body>
</html>

DOM像原子包含著亞原子微粒那樣,也有很多類型的DOM節點包含著其他類型的節點。接下來我們先看看其中的三種:

<div><p title="title">content</p>
</div>

上述結構中,div、p就是元素節點,content就是文本節點,title就是屬性節點

2.操作

日常前端開發,我們都離不開DOM操作

在以前,我們使用Jquery、zepto等庫來操作DOM,之后在vue、Angular,react等框架出現后,我們通過操作數據來控制DOM(絕大多數時候),越來越少的直接去操作DOM

但這并不代表原生操作不重要。相反,DOM操作才能有助于我們理解框架深層的內容

下面就來分析DOM常見的操作,主要分為:

  • 創建節點
  • 查詢節點
  • 更新節點
  • 添加節點
  • 刪除節點

2.1 創建節點

2.1.1.createElement

創建新元素,接收一個參數,及要創建元素的標簽名

const devEl = document.createElement('div')

2.1.2.createTextNode

創建一個文本節點

const textEl = document.createTextNode('Hello World!')

2.1.3.createDocumentFragment

創建一個文檔片段,這是一個重要的DOM優化技術

const fragment = document.createDocumentFragment()

DocumentFragment 的特點:

  1. 輕量級容器 - 不是真實DOM的一部分,存在于內存中
  2. 性能優化 - 避免頻繁的DOM操作引起重排和重繪
  3. 批量操作 - 可以先構建復雜結構,再一次性插入
  4. 插入后消失 - 插入DOM時只有子節點被插入,fragment本身消失

使用示例:

// 創建文檔片段
const fragment = document.createDocumentFragment()
?
// 批量創建元素
for(let i = 0; i < 100; i++) {const li = document.createElement('li')li.textContent = `項目 ${i}`fragment.appendChild(li) ?// 在內存中操作,不觸發重排
}
?
// 一次性插入到DOM
const ul = document.createElement('ul')
ul.appendChild(fragment) ?// 所有li被轉移到ul中
document.body.appendChild(ul)
?
console.log(fragment.childNodes.length) // 0,fragment已經空了

性能對比:

// 普通方式 - 每次appendChild都可能觸發重排
const container1 = document.getElementById('container1')
for(let i = 0; i < 1000; i++) {const div = document.createElement('div')container1.appendChild(div) // 頻繁DOM操作
}
?
// Fragment方式 - 只觸發一次重排
const fragment = document.createDocumentFragment()
for(let i = 0; i < 1000; i++) {const div = document.createElement('div')fragment.appendChild(div) // 內存操作
}
document.getElementById('container2').appendChild(fragment) // 一次性插入

2.1.4.createAttribute

創建屬性節點,可以是自定義屬性

const dataAttribute = document.createAttribute('custom')
console.log(dataAttribute);

2.2.獲取節點

2.2.1.querySelector

傳入任何有效的css選擇器,即可選中單個DOM元素(首個):

1 document.querySelector('.element')
2 document.querySelector('#element')
3 document.querySelector('div')
4 document.querySelector('[name="username"]')
5 document.querySelector('div + p > span')

如果頁面上沒有指定的元素時,返回null

2.2.2.querySelectorAll

返回一個包含節點子樹內所有與之相匹配的Element節點列表,如果沒有相匹配的,則返回一個空節點列表

const notLive = document.querySelectorAll("p");

需要注意的是,該方法返回的是一個NodeList的靜態實例,它是一個靜態的“快照”,而非"實時"的查詢

關于獲取DOM元素的方法還有如下:

1 document.getElementById('id屬性值');返回擁有指定id的對象的引?
2 document.getElementsByClassName('class屬性值');返回擁有指定class的對象集合
3 document.getElementsByTagName('標簽名');返回擁有指定標簽名的對象集合
4 document.getElementsByName('name屬性值'); 返回擁有指定名稱的對象結合
5 document/element.querySelector('CSS選擇器'); 僅返回第—個匹配的元素
6 document/element.querySelectorAll('CSS選擇器'); ?返回所有匹配的元素
7 document.documentElement; 獲取頁?中的HTML標簽
8 document.body; 獲取頁?中的BODY標簽
9 document.all['']; 獲取頁?中的所有元素節點的對象集合型

除此之外,每個DOM元素還有parentNode、childNodes、firstChild、lastChild、nextSibling、previousSibling屬性,關系如下圖所示

2.3.更新節點

2.3.1.innerHTML

不但可以修改一個DOM節點的文本內容,還可以直接通過HTML片段修改DOM節點內部的子樹

// 獲取<p id="p">...</p >
var p = document.getElementById('p'); // 設置?本為abc:
p.innerHTML = 'ABC'; // <p id="p">ABC</p > // 設置HTML:
p.innerHTML = 'ABC <span style="color:red">RED</span> XYZ';
// <p>...</p >的內部結構已修改

2.3.2.innerText、textContent

自動對字符串進行HTML編碼,保證無法設置任何HTML標簽

1 // 獲取<p id="p-id">...</p >
2 var p = document.getElementById('p-id');
3 // 設置?本 :
4 p.innerText = '<script>alert("Hi")</script>';
5 // HTML被?動編碼 ,?法設置?個<script>節點 :
6 // <p id="p-id"><script>alert("Hi")</script></p >

兩者的區別在于讀取屬性時,innerText不返回隱藏元素的文本,而textContent返回所有文本

2.3.3.style

DOM節點的style屬性對應所有的css,可以直接獲取或設置。遇到-需要轉化為駝峰命名

1 // 獲取<p id="p-id">...</p >
2 const p = document.getElementById('p-id');
3 // 設置CSS:
4 p.style.color = '#ff0000';
5 p.style.fontSize = '20px'; // 駝峰命名
6 p.style.paddingTop = '2em';

2.4.添加節點

2.4.1.innerHTML

如果這個DOM節點是空的,例如,<div></div>,那么直接使用innerHTML = '<span></span>>'就可以修改DOM節點的內容,相當于添加了新的DOM節點

如果這個DOM節點不是空的,那就不能這么做,因為innerHTML會直接替換掉原來的所有子節點

2.4.2.appendChild

把一個子節點添加到父節點的最后一個子節點

舉個例子

<!-- HTML結構  -->
<p id="js">JavaScript</p >
<div id="list"><p id="java">Java</p > ? ? <p id="python">Python</p ><p id="scheme">Scheme</p >
</div>

添加一個p元素

1 const js = document.getElementById('js')
2 js.innerHTML = "JavaScript"
3 const list = document.getElementById('list');
4 list.appendChild(js);

現在HTML結構變成了下面

1 <!-- HTML結構  -->
2 <div id="list">
3 ? ? <p id="java">Java</p >
4 ? ? <p id="python">Python</p >
5 ? ? <p id="scheme">Scheme</p >
6 ? ? <p id="js">JavaScript</p > ?<!-- 添加元素  -->
7 </div>

上述代碼中,我們是獲取DOM元素后再進行添加操作,這個js節點是已經存在當前文檔樹中,因此這個節點首先會從原先的位置刪除,再插入到新的位置

如果動態添加新的節點,則先創建一個新的節點,然后插入到指定的位置

1 const list = document.getElementById('list'), 2 const haskell = document.createElement('p');
3 haskell.id = 'haskell';
4 haskell.innerText = 'Haskell';
5 list.appendChild(haskell);

2.4.3.insertBefore

把子節點插入到指定位置,使用方法如下:

parentElement.insertBefore(newElement, referenceElement)

子節點會插入到reference Element之前

2.4.4.setAttribute

在指定元素中添加一個屬性節點,如果元素中已有該屬性改變屬性值

1 const div = document.getElementById('id')
2 div.setAttribute('class', 'white');//第?個參數屬性名, 第?個參數屬性值

2.5.刪除節點

刪除一個節點,首先要獲得該節點本身以及它的父節點,然后,調用父節點的removeChild把自己刪掉

1 // 拿到待刪除節點 :
2 const self = document.getElementById('to-be-removed');
3 // 拿到?節點 :
4 const parent = self.parentElement;
5 // 刪除 :
6 const removed = parent.removeChild(self);
7 removed === self; // true

刪除后的節點雖然不在文檔樹中了,但其實它還在內存中,可以隨時再次添加到別的位置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97813.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Kubernetes】知識點3

25. 說明Job與CronJob的功能。答&#xff1a;Job&#xff1a;一次性作業&#xff0c;處理短暫的一次性任務&#xff0c;僅執行一次&#xff0c;并保證處理的一個或者多個 Pod 成功結束。CronJob&#xff1a;周期性作業&#xff0c;可以指定每過多少周期執行一次任務。26. Kuber…

LINUX-網絡編程-TCP-UDP

1.目的&#xff1a;不同主機&#xff0c;進程間通信。2.解決的問題1&#xff09;主機與主機之間物理層面必須互相聯通。2&#xff09;進程與進程在軟件層面必須互通。IP地址&#xff1a;計算機的軟件地址&#xff0c;用來標識計算機設備MAC地址&#xff1a;計算機的硬件地址&am…

目標檢測定位損失函數:Smooth L1 loss 、IOU loss及其變體

Smooth L1 Loss 概述 Smooth L1 Loss&#xff08;平滑 L1 損失&#xff09;&#xff0c;是一個在回歸任務&#xff0c;特別是計算機視覺中的目標檢測領域&#xff08;如 Faster R-CNN, SSD&#xff09;非常核心的損失函數。 xxx 表示模型的預測值&#xff0c;yyy 表示真實值&am…

Android開發之fileprovider配置路徑path詳細說明

第一步在清單文件配置fileprovider屬性<providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.fileprovider"android:exported"false"android:grantUriPermissions"true"><meta-d…

【ComfyUI】圖像描述詞潤色總結

在 ComfyUI 的工作流中&#xff0c;圖像反推描述詞能幫我們從圖像里抽取語義信息&#xff0c;但這些原始描述往往還顯得生硬&#xff0c;缺乏創意或流暢性。為了讓提示詞更自然、更有表現力&#xff0c;就需要“潤色”環節。潤色節點的任務&#xff0c;不是重新生成描述&#x…

java面試中經常會問到的IO、NIO問題有哪些(基礎版)

文章目錄一、IO 基礎與分類二、NIO 核心組件與原理三、NIO 與 BIO 的實戰對比四、AIO 與 NIO 的區別五、Netty 相關&#xff08;NIO 的高級應用&#xff09;總結Java 中的 IO&#xff08;輸入輸出&#xff09;和 NIO&#xff08;非阻塞 IO&#xff09;是面試中的重要考點&#…

時序數據庫選型指南:如何為工業場景挑選最強“數據底座”

工業4.0時代&#xff0c;工廠化身為巨大的數據生產中心。數以萬計的傳感器、PLC和設備每時每刻都在產生著海量的時間序列數據&#xff08;Time-Series Data&#xff09;&#xff1a;溫度、壓力、流速、振動、設備狀態……這些帶時間戳的數據是工業互聯網的血液&#xff0c;蘊含…

【排序算法】冒泡 選排 插排 快排 歸并

一、冒泡排序// 冒泡排序var bubbleSort function (arr) {const len arr.length;for (let i 0; i < len; i) {let isSwap false;for (let j 0; j < len - 1; j) {// 每一次遍歷都要比較相鄰元素的大小&#xff0c;如果滿足條件就交換位置if (arr[j] > arr[j 1])…

電子病歷空缺句的語言學特征描述與自動分類探析(以GPT-5為例)(中)

語言學特征刻畫(特征庫) 句法特征 句法特征是識別 SYN 類電子病歷空缺句的核心語言學維度,其量化分析通過構建依存句法結構的形式化指標,實現對語法不完整性的客觀描述。該類特征主要包括依存樹不完備指標、謂詞-論元覆蓋率及從屬連詞未閉合三類核心參數,共同構成 SYN 類…

InnoDB存儲引擎-事務

1. 事務概述事務可由一條簡單的SQL語句組成,也可以由一組復雜的SQL語句組成. 事務是訪問并更新數據庫中各種數據項的一個程序執行單元. 在事務中的操作, 要么都做修改, 要么都不做. 對于 InnoDB存儲引擎而言, 其默認的事務隔離級別 RR , 完全遵循和滿足了事務的 ACID 特性. 1.1…

web項目的目錄結構

web項目的目錄結構 WEB-INF 存放class文件、jar文件和配置文件&#xff0c;對于用戶來說該文件夾是不可見的WEB-INF/web.xml web應用程序的描述文件&#xff0c;用來配置資源&#xff0c;如servlet、過濾器、監聽器等WEB-INF/classes 用于存放class文件&#xff0c;也是該web應…

數據結構_隊列Queue(C語言實現)

一、隊列的基本概念 1.隊列定義 隊列是一種先進先出的線性表數據結構&#xff08;First in First out&#xff09;,現實中的例子就是&#xff0c;排隊購票&#xff0c;先排隊的先購票&#xff0c;購完票之后直接從這個隊中離開&#xff0c;后來的在這個隊后面排隊&#xff0c;這…

C++對CPU緩存的合理利用

緩存體系 在計算機的體系結構中,存儲速度是分了好幾層: CPU緩存,又分成了L1/L2/L3等多層緩存,我們暫時看成同一層。訪問速度最快 內存,訪問速度次之,大概是CPU緩存的幾十分之一 硬盤,訪問速度最慢,是內存訪問速度的幾十分之一 所以,在計算機體系結構中,把下一層的數…

貝葉斯定理:理解概率更新與實際場景應用

貝葉斯定理及其應用&#xff1a;從基礎到實戰 貝葉斯定理&#xff08;Bayes’ Theorem&#xff09;是概率論中最基礎也是最強大的工具之一。它通過將先驗知識與新證據結合&#xff0c;能夠幫助我們在不確定的情況下做出更加精準的判斷。本文將從貝葉斯定理的核心概念、公式開始…

組件之間的傳遞參數傳遞(常用父向子傳遞)

現在&#xff0c;有子組件<MdsWxSourceDetailref"mdsWx":rank-obj"activeRankObj":media-name"activeObj.mediaName" :error-info"activeErrorInfo" ></MdsWxSourceDetail>以上代碼在MdsIndexRankDetail&#xff0…

java畢業設計-基于springboot區塊鏈的電子病歷數據共享平臺設計與實現(附源碼數據庫文檔資料)

博主介紹&#xff1a;??碼農一枚 &#xff0c;專注于大學生項目實戰開發、講解和畢業&#x1f6a2;文撰寫修改等。全棧領域優質創作者&#xff0c;博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰 ??技術范圍&#xff1a;&am…

【新啟航】3D 逆向抄數的三維能力架構:數據采集工具操作 × 幾何處理算法應用 × 行業場景適配技能

摘要3D 逆向抄數的落地效果依賴多維度能力協同&#xff0c;本文提出 “數據采集工具操作 - 幾何處理算法應用 - 行業場景適配技能” 的三維能力架構。通過拆解各維度核心要素&#xff0c;分析數據采集工具&#xff08;激光、結構光等&#xff09;的操作要點&#xff0c;解析幾何…

RocksDB 在 macOS M 系列 上運行時報錯的解決方案

問題現象 項目中引入可Kafka Stream &#xff0c;Windows下啟動不報錯 &#xff0c;但是在 macOS M系列 環境下就會報錯&#xff0c;初步定位是使用 Java 項目調用 RocksDB 時&#xff0c;運行過程中出現以下報錯&#xff1a; UnsatisfiedLinkError: no rocksdbjni in java.lib…

深度學習之第五課卷積神經網絡 (CNN)如何訓練自己的數據集(食物分類)

簡介 之前一直使用的是現有人家的數據集&#xff0c;現在我們將使用自己的數據集進行訓練。 基于卷積神經網絡 (CNN) 的 MNIST 手寫數字識別模型 一、訓練自己數據集 1.數據預處理 我們現在有這樣的數據集如下圖&#xff1a; 每一個文件夾里面有著對應的圖片。我們要將這些…

【Big Data】AI賦能的ClickHouse 2.0:從JIT編譯到LLM查詢優化,下一代OLAP引擎進化路徑

目錄 1. 什么是ClickHouse&#xff1f; 2. 誕生背景與發展歷程 3. 架構設計解析 3.1 存儲引擎&#xff1a;MergeTree家族 3.2 分布式模型&#xff1a;分片與副本 3.3 執行流程&#xff1a;向量化與并行計算 4. 解決的問題與適用場景 4.1 典型問題 4.2 適用場景 5. 關…