前端頁面Javascript進階DOM與BOM

一、DOM基礎概念

DOM 是文檔對象模型,提供編程接口用于操作 HTML 和 XML 文檔。它將文檔表示為節點樹,每個節點代表文檔的一部分,如元素、文本、屬性等。通過 DOM,開發者可以訪問和修改文檔的結構、樣式與內容。

文檔節點類型

元素節點

對應 HTML 標簽,如<div><p>等。

文本節點

包含標簽內的文本內容。

屬性節點

對應元素的屬性,如idclass等。

二、訪問DOM元素

通過標簽名

getElementsByName返回指定名稱的所有元素集合。

const radios = document.getElementsByName("radio");

通過類名

getElementsByClassName返回指定類名的所有元素集合。

const elements = document.getElementsByClassName("example-class");

通過ID

getElementById快速獲取指定ID的唯一元素。

const element = document.getElementById("example-id");

CSS選擇器方式

querySelector返回匹配指定CSS選擇器的第一個元素。

const firstDiv = document.querySelector("div");
const activeElement = document.querySelector(".active");

querySelectorAll返回匹配指定選擇器的所有元素的靜態節點列表。

const allDivs = document.querySelectorAll("div");
const elementsWithClass = document.querySelectorAll(".example-class");

三、創建和修改DOM元素

創建元素

createElement創建指定標簽的新元素。

const newDiv = document.createElement("div");

創建文本節點

createTextNode創建包含指定文本的新文本節點。

const textNode = document.createTextNode("Hello, World!");

添加元素到頁面

appendChild將子節點添加到父節點的子節點列表末尾。

parentElement.appendChild(newDiv);

prepend將節點添加到父節點的子節點列表開頭。

parentElement.prepend(newDiv);

insertBefore在父節點的指定子節點前插入新子節點。

parentElement.insertBefore(newNode, existingNode);

修改元素內容

直接操作元素的textContent屬性來替換文本內容。

element.textContent = "新的文本內容";

或操作innerHTML屬性來替換包含HTML標簽的內容。

element.innerHTML = "<strong>新的HTML內容</strong>";

修改元素屬性

操作className屬性修改類名。

element.className = "new-class";

使用setAttribute方法設置指定屬性的值。

element.setAttribute("id", "new-id");
element.setAttribute("data-custom", "value");

使用getAttribute方法獲取指定屬性的值。

const value = element.getAttribute("data-custom");

四、刪除DOM元素

刪除子節點

removeChild從父節點中移除指定的子節點。

parentElement.removeChild(childElement);

元素的remove方法

remove移除元素自身。

element.remove();

五、DOM事件處理

添加事件監聽器

addEventListener為元素添加指定類型的事件監聽器。

element.addEventListener("click", function(event) {console.log("點擊事件觸發");
});

事件對象

事件處理函數接收事件對象作為參數,包含事件相關的信息和方法。

element.addEventListener("click", function(event) {console.log(event.type); // 輸出 "click"console.log(event.target); // 輸出被點擊的元素
});

阻止默認行為

調用事件對象的preventDefault方法可阻止事件的默認行為。

const link = document.querySelector("a");
link.addEventListener("click", function(event) {event.preventDefault();console.log("鏈接點擊默認行為被阻止");
});

停止事件傳播

調用事件對象的stopPropagation方法可阻止事件冒泡。

const childElement = document.querySelector(".child");
childElement.addEventListener("click", function(event) {event.stopPropagation();console.log("子元素點擊事件");
});
const parentElement = document.querySelector(".parent");
parentElement.addEventListener("click", function(event) {console.log("父元素點擊事件");
});

六、DOM操作實踐案例

動態更新頁面內容

根據用戶選擇動態更新商品信息展示。

<div id="product-info"><h2 id="product-title">商品標題</h2><p id="product-price">商品價格</p><button id="add-to-cart">加入購物車</button>
</div><script>const productData = {title: "智能手機",price: "2999元"};document.getElementById("product-title").textContent = productData.title;document.getElementById("product-price").textContent = productData.price;document.getElementById("add-to-cart").addEventListener("click", function() {alert(`${productData.title} 已加入購物車`);});
</script>

表單驗證

實時驗證表單輸入內容,增強用戶體驗。

<form id="register-form"><input type="text" id="username" placeholder="請輸入用戶名"><span id="username-error" class="error-message"></span><button type="submit">注冊</button>
</form><script>const usernameInput = document.getElementById("username");const usernameError = document.getElementById("username-error");const registerForm = document.getElementById("register-form");function validateUsername() {const username = usernameInput.value.trim();if (username.length < 3) {usernameError.textContent = "用戶名至少3個字符";return false;} else {usernameError.textContent = "";return true;}}usernameInput.addEventListener("input", validateUsername);registerForm.addEventListener("submit", function(event) {if (!validateUsername()) {event.preventDefault();}});
</script>

DOM操作性能優化

在更新大量列表數據時,使用文檔片段提升性能。

<ul id="items-list"></ul><script>const itemsList = document.getElementById("items-list");const fragment = document.createDocumentFragment();for (let i = 0; i < 1000; i++) {const li = document.createElement("li");li.textContent = `項目 ${i + 1}`;fragment.appendChild(li);}itemsList.appendChild(fragment);
</script>

七、總結

DOM 是前端開發的核心,熟練掌握 DOM 操作對構建動態、交互豐富的網頁至關重要。本文詳細介紹了訪問、創建、修改、刪除 DOM 元素,以及處理事件的方法,并提供了實踐案例。不斷練習和探索,你將能夠高效地運用 DOM 操作,打造出色的前端應用。

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

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

相關文章

AWS CloudFormation深度解析:構建現代云原生應用基礎設施

在現代云原生應用開發中,基礎設施即代碼(Infrastructure as Code, IaC)已成為標準實踐。本文將深入解析一個完整的AWS CloudFormation模板,該模板為GlowChat Connector應用構建了生產級的基礎設施。 模板概述 這個CloudFormation模板是一個兩部分部署架構中的第一部分,專…

Oracle 查看所有表的字段名、數據類型及長度

1.只查看某個特定表的字段名 SELECT column_name, data_type, data_length FROM user_tab_columns WHERE table_name 你的表名 -- 注意大寫 ORDER BY column_id;2.查看當前用戶下所有表的字段名 SELECT table_name, column_name, data_type, data_length FROM user_tab_colu…

創客匠人分享知識付費監管升級下的行業價值重構:從合規挑戰到發展機遇的實踐路徑

引言&#xff1a;監管政策背后的行業邏輯轉向 知識付費領域的監管體系升級&#xff0c;本質上是對行業發展路徑的重新校準。隨著 "內容產品需具備知識沉淀載體" 等新規落地&#xff0c;行業正在經歷從 "流量驅動型增長" 到 "價值驅動型發展" 的…

邊緣計算的認識和應用

邊緣計算 邊緣計算是一種分布式計算范式&#xff0c;它將計算能力和數據存儲放置在離數據源更近的位置&#xff0c;而不是依賴于集中式的數據中心。通過在“邊緣”進行數據處理&#xff0c;邊緣計算可以減少延遲、提高響應速度、節省帶寬&#xff0c;并增強數據隱私和安全性。…

Arduino R4 WIFI橫向滾動顯示16×16LED屏

實現一個從左向右橫向滾動的"吉祥如意"顯示效果。 arduino r4 WiFi滾動顯示16*16led #include <SPI.h>// 引腳定義 const int RowA 2, RowB 3, RowC 4, RowD 5; const int OE 6; const int LATCH 10;// 字模數據 (吉祥如意) const PROGMEM byte characte…

html css js網頁制作成品——HTML+CSS+js力學光學天文網頁設計(4頁)附源碼

目錄 一、&#x1f468;?&#x1f393;網站題目 二、??網站描述 三、&#x1f4da;網站介紹 四、&#x1f310;網站效果 五、&#x1fa93; 代碼實現 &#x1f9f1;HTML 六、&#x1f947; 如何讓學習不再盲目 七、&#x1f381;更多干貨 一、&#x1f468;?&#x1f…

嵌入式開發之freeRTOS移植

FreeRTOS 是一款廣泛應用于嵌入式系統的開源實時操作系統&#xff08;RTOS&#xff09;&#xff0c;其移植過程需要結合具體硬件平臺和編譯器進行適配。以下是 FreeRTOS 移植的詳細步驟和關鍵注意事項&#xff1a; 一、移植前的準備工作 1. 硬件平臺確認 處理器架構&#xf…

【算法 day07】LeetCode 344.反轉字符串 | 541. 反轉字符串II | 卡碼網:54.替換數字

344.反轉字符串 題目鏈接 | 文檔講解 |視頻講解 : 鏈接 1.思路&#xff1a; 采用雙指針&#xff0c;left從0開始移動,right從尾元素進行移動 循環判斷條件&#xff1a;left< right,邊界值使用舉例法&#xff0c;eg: [ h ,e ,l,o ]偶數個不會相遇, [h ,e ,l ,l ,o ]奇數個&…

從檢索到生成:RAG 如何重構大模型的知識邊界?

引言&#xff1a;知識邊界的突破與重構 在人工智能技術快速發展的今天&#xff0c;大型語言模型&#xff08;LLMs&#xff09;已經展現出強大的文本生成和理解能力。然而&#xff0c;這些模型在實際應用中仍面臨著知識時效性、事實準確性和可溯源性等核心挑戰。檢索增強生成&a…

前端基礎知識CSS系列 - 05(BFC的理解)

一、是什么 我們在頁面布局的時候&#xff0c;經常出現以下情況&#xff1a; 這個元素高度怎么沒了&#xff1f;這兩欄布局怎么沒法自適應&#xff1f;這兩個元素的間距怎么有點奇怪的樣子&#xff1f;...... 原因是元素之間相互的影響&#xff0c;導致了意料之外的情況&…

Prompt Engineering 學習指南:從入門到精通的最佳路徑與資源

本 Prompt Engineering 技術報告,旨在提供一個從入門到精通的清晰學習路徑、核心方案,并附上最關鍵的 GitHub 倉庫資源。您可以將此報告作為快速提升 Prompt 能力的“速查手冊”和“成長地圖”。 Prompt Engineering 學習指南:從入門到精通的最佳路徑與資源 技術報告摘要 (…

fastmcp MCPConfig多服務器使用案例;sse、stdio、streamable-http使用

1、sse、stdio、streamable-http使用 參考&#xff1a;https://gofastmcp.com/deployment/running-server#the-run-method stdio本地使用&#xff1b;sse、streamable-http遠程調用&#xff08; Streamable HTTP—New in version: 2.3.0&#xff09; 調用&#xff1a; stdio、…

網站服務器被DDOS攻擊打不開,是要換高防服務器還是加CDN能防護住?

高防云服務器、高防 IP 和高防 CDN 作為常見應對網絡攻擊的重要利器&#xff0c;它們各自有著獨特的特點和應用場景&#xff0c;從技術架構看&#xff0c;高防云服務器是資源型防護&#xff0c;深度整合計算與防御資源&#xff1b;高防IP是流量型防護&#xff0c;以代理模式實現…

深入解析原型模式:從理論到實踐的全方位指南

深入解析原型模式&#xff1a;從理論到實踐的全方位指南 引言&#xff1a;為什么需要原型模式&#xff1f; 在軟件開發過程中&#xff0c;對象創建是一個頻繁且關鍵的操作。傳統方式&#xff08;如直接使用new關鍵字&#xff09;在某些場景下會顯得效率低下且不夠靈活。想象這…

HuggingFace鏡像配置失效問題深度解析:Python模塊導入機制的陷阱

前言 在使用HuggingFace的transformers和datasets庫時&#xff0c;國內用戶經常會遇到網絡連接問題。雖然設置了鏡像源環境變量&#xff0c;但仍然報錯無法連接到huggingface.co。本文將深入分析這個問題的根因&#xff0c;并從Python模塊導入機制的角度解釋為什么環境變量設置…

leetcode146-LRU緩存

leetcode 146 思路 什么是LRU緩存&#xff1f; LRU&#xff08;Least Recently Used&#xff09;緩存是一種常見的緩存淘汰策略&#xff0c;核心思想是&#xff1a;當緩存容量滿時&#xff0c;優先淘汰最久未使用的數據。LeetCode 146 題要求實現一個支持get和put操作的 LR…

MQTT:構建高效物聯網通信的輕量級協議

MQTT – 輕量級物聯網消息推送協議 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是機器對機器(M2M)/物聯網(IoT)連接協議。它被設計為一個極其輕量級的發布/訂閱消息傳輸協議。對于需要較小代碼占用空間和/或網絡帶寬非常寶貴的遠程連接非常有用&#xf…

AI自動生成復雜架構圖,流程圖,思維導圖

AI自動生成復雜架構圖&#xff0c;流程圖&#xff0c;思維導圖方案 1. 背景 在我們自己去繪制架構圖&#xff0c;流程圖&#xff0c;思維導圖的時候&#xff0c;我們通常需要花費大量的時間去繪制。 目前的一些直接生圖的模型也只能生成簡單的流程圖&#xff0c;不能生成復雜…

129. 求根節點到葉節點數字之和 --- DFS +回溯(js)

129. 求根節點到葉節點數字之和 --- DFS 回溯&#xff08;js&#xff09; 題目描述解題思路完整代碼 題目描述 129. 求根節點到葉節點數字之和 解題思路 和 257. 二叉樹的所有路徑&#xff08;js&#xff09; 是一樣的思路。 不一樣的地方就是遇到葉子節點的時候把路徑拼接…

SpringBoot電腦商城項目--修改默認收貨地址

1. 修改默認收貨地址-持久層 1.1 規劃sql語句 檢測當前用戶向設置為默認收貨地址的這條數據是否存在 SELECT * FROM t_address WHERE aid#{aid} 在修改用戶的收獲默認地址之前&#xff0c;先將所有的收貨地址設置為非默認 UPDATE t_address SET is_default0 WHERE uid#{uid} …