2.10DOM和BOM插入/移除/克隆

1.DOM創建/插入/移除/克隆

1.1創建元素

前面我們使用過 document.write 方法寫入一個元素:

  • 這種方式寫起來非常便捷,但是對于復雜的內容、元素關系拼接并不方便;
  • 它是在早期沒有 DOM 的時候使用的方案,目前依然被保留了下來;

那么目前我們想要插入一個元素,通常會按照如下步驟:

  • 步驟一:創建一個元素;
  • 步驟二:插入元素到 DOM 的某一個位置;

創建元素:document.createElement (tag)

javascript

var boxEl = document.querySelector(".box")
var h2El = document.createElement("h2")
h2El.innerHTML = "我是標題"
h2El.classList.add("title")
boxEl.append(h2El)

1.2 插入元素

插入元素的方式如下:

  • node.append (...nodes or strings) —— 在 node 末尾插入節點或字符串,
  • node.prepend (...nodes or strings) —— 在 node 開頭插入節點或字符串,
  • node.before (...nodes or strings) —— 在 node 前面插入節點或字符串,
  • node.after (...nodes or strings) —— 在 node 后面插入節點或字符串,
  • node.replaceWith (...nodes or strings) —— 將 node 替換為給定的節點或字符串。
<!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><span class="span">我是span1</span><div class="box"><span class="span">我是span2</span>我是box元素</div><script>var boxEl = document.querySelector(".box")//1.通過innerHTML(不推薦)// boxEl.innerHTML = "<h2 class='title'>我是標題</h2>"//2.真實創建一個DOM對象var h2El = document.createElement("h2")h2El.className = "title"h2El.classList.add("active")h2El.textContent="我是標題2"//將元素插入boxEl// boxEl.append(h2El)// boxEl.prepend(h2El)//將元素插入到第二個span元素之后var spanEl =boxEl.querySelector("span")spanEl.after(h2El)</script>
</body>
</html>

?1.3移除和克隆元素

移除元素我們可以調用元素本身的 remove 方法:

setTimeout(() => {h2El.remove()
}, 2000);

?

如果我們想要復制一個現有的元素,可以通過 cloneNode 方法:

  • 可以傳入一個 Boolean 類型的值,來決定是否是深度克隆;
  • 深度克隆會克隆對應元素的子元素,否則不會;
<!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 class="box"><h2 id="title">我是標題</h2><div class="container"><p><span class="keyword">hehehhe</span>我是段落,<span class="keyword">chen</span>哈哈哈哈</p></div></div><script>// //一、通過導航獲取// //1.拿到body// var bodyEl = document.body// //2.拿到box// var boxEl = bodyEl.firstElementChild// //3.拿到container// var containerEl = boxEl.children[1]// //4.拿到p// var pEl = containerEl.children[0]// //5.拿到keyword// var spanEl = pEl.children[0]// console.log(spanEl)//二、直接獲取到keyword//1.通過className獲取元素// var keywordEls = document.getElementsByClassName("keyword")//修改第一個// keywordEls[0].style.color = "red"//修改所有的// for (var i = 0; i < keywordEls.length; i++) {//   keywordEls[i].style.color = "red"// }//2.通過id獲取元素// var titleEl = document.getElementById("title")// titleEl.style.color = "orange"//三、querySelector:通過選擇器查詢// var keywordEl = document.querySelector(".keyword")// console.log(keywordEl)//keywordEls是對象,可迭代的//可迭代對象:String/數組/節點的列表var keywordEls = document.querySelectorAll(".keyword")for (var el of keywordEls) {console.log(el)}var title1 = document.querySelector("#title")title1.style.color = "red"</script>
</body>
</html>

1.4 舊的元素操作方法

  • parentElem.appendChild(node):
    • 在 parentElem 的父元素最后位置添加一個子元素
  • parentElem.insertBefore(node, nextSibling):
    • 在 parentElem 的 nextSibling 前面插入一個子元素;
  • parentElem.replaceChild(node, oldChild):
    • 在 parentElem 中,新元素替換之前的 oldChild 元素;
  • parentElem.removeChild(node):
    • 在 parentElem 中,移除某一個元素;

    • 現在我們只需要拿到一個元素在后面直接被before要添加的元素即可

2.獲取元素的大小-滾動屬性

clientWidth: contentWith+padding (不包含滾動條)
clientHeight: contentHeight+padding
clientTop: border - top 的寬度
clientLeft: border - left 的寬度
offsetWidth: 元素完整的寬度
offsetHeight: 元素完整的高度
offsetLeft: 距離父元素的 x
offsetHeight: 距離父元素的 y
scrollHeight: 整個可滾動的區域高度
scrollTop: 滾動部分的高度

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box{height: 50px;width: 50px;overflow: scroll;font-size: 25px;}</style>
</head>
<body><div class="box">奧利弗撿gdgadfafafafefvdmvndemd奧利飛機愛上了發順豐弗發發發</div><script>//1.獲取樣式(局限性很強)var boxEl = document.querySelector(".box")// var sizeEl = getComputedStyle(boxEl)// console.log(sizeEl.height,sizeEl.width)// console.log(sizeEl.fontSize)//2.獲取更多信息console.log(boxEl.clientWidth)console.log(boxEl.clientHeight)console.log(boxEl.clientLeft)console.log(boxEl.clientTop)console.log(boxEl.offsetWidth)console.log(boxEl.offsetHeight)// console.log(first.offsetLeft)window.onclick = function () {console.log(boxEl.scrollTop)}</script>
</body>
</html>

3.Window大小-滾動-方法

window 的 width 和 height

  • innerWidth、innerHeight:獲取 window 窗口的寬度和高度(包含滾動條)
  • outerWidth、outerHeight:獲取 window 窗口的整個寬度和高度(包括調試工具、工具欄)
  • documentElement.clientHeight、documentElement.clientWidth:獲取 html 的寬度和高度(不包含滾動條)

window 的滾動位置:

  • scrollX:X 軸滾動的位置(別名 pageXOffset)
  • scrollY:Y 軸滾動的位置(別名 pageYOffset)

也有提供對應的滾動方法:

  • 方法 scrollBy (x,y):將頁面滾動至相對于當前位置的 (x,y) 位置;

4.滾動+顯示隱藏案例練習

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box{background-color: red;height: 100px;}.btn1{position: fixed;right: 20px;bottom: 20px;}.btn2{position:fixed;left:20px;bottom: 20px;/* display: none; */}</style>
</head>
<body><div class="box">我是div元素</div><button class="btn1">滾動位置</button><button class="btn2">回到頂部</button><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><script>//window大小console.log(window.outerHeight)console.log(window.outerWidth)//內容區域大小console.log(innerHeight)console.log(innerWidth)console.log(document.documentElement.offsetHeight)console.log(document.documentElement.offsetWidth)window.onclick = function(){console.log(window.scrollX)console.log(window.scrollY)}window.onscroll = function() {console.log(window.scrollY)}//回到頂部var backBtnEl = document.querySelector(".btn2")backBtnEl.hidden = truewindow.onscroll = function(){if(window.scrollY > 600){// backBtnEl.style.display = "block"backBtnEl.hidden = false//display只能使用元素,如果動畫的話需要使用opcity}else{//  backBtnEl.style.display = "none"backBtnEl.hidden = true}}//點擊按鈕后滾動到某個位置var scrollBtnEl = document.querySelector(".btn1")scrollBtnEl.onclick = function() {window.scrollBy(0, 100) //在原來的位置的基礎上面增加100//window.scrollTo(0, 100) //滾動到某一個位置}</script>
</body>
</html>

?5.綜合DOM小案例

練習一:通過prompt接收用戶的輸入,根據輸入創建一個列表

<!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><h1>動態創建列表</h1><ul class="ul1"></ul><script>var ulEl = document.querySelector(".ul1")while(true){var input = prompt("請輸入")if(!input){break}var liEl =document.createElement("li")liEl.textContent = inputulEl.append(liEl)}</script>
</body>
</html>

練習二:動態的顯示時間

<!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><h1 class="time">2025-07-24 </h1><script>//String//padStart(參數1,參數2)//參數一:限制的位數//參數二:不足的以什么補齊//封裝一個工具函數function padLeft (content, count, padStr){//這里可以先給一個默認值count = count || 2padStr = padStr || "0"content = String(content)return content.padStart(count, padStr)}var timeEl = document.querySelector(".time")setInterval(function(){      var date = new Date()var year = date.getFullYear()var month = padLeft(date.getMonth())var day = padLeft(date.getDate())var hour = padLeft(date.getHours())var minute = padLeft(date.getMinutes())var second = padLeft(date.getSeconds())timeEl.textContent=(`${year}-${month}-${day} ${hour}:${minute}:${second}`)},1000);</script>
</body>
</html>

練習三:倒計時

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.countdown {color: red;font-size: 20px;}.countdown .time {background-color: red;color: #fff;display: inline-block;padding: 5px;border-radius: 5px;}</style>
</head>
<body><div class="countdown"><span class="time hour">03</span><span class="split">:</span><span class="time minute">25</span><span class="split">:</span><span class="time second">42</span></div><script>//1.獲取元素var hour1 = document.querySelector(".hour")var minute1 = document.querySelector(".minute")var second1 = document.querySelector(".second")//2.設置內容var endDate = new Date()endDate.setHours(24)endDate.setMinutes(0)endDate.setSeconds(0)endDate.setMilliseconds(0)setInterval(function(){//獲取倒計時的小時-分鐘-秒鐘//12:50:20 =>24:00:00var nowDate = new Date()var intervalTime = Math.floor((endDate.getTime()-nowDate.getTime())/1000)//console.log(intervalTime)//x小時x分鐘x秒//125:x百x十xge// var num = 125// console.log(Math.floor(num/10*10))// console.log(Math.floor((num/10)%10))// console.log(Math.floor(num%10))var hour = Math.floor(intervalTime/3600)var minute =Math.floor((intervalTime/60)%60)var second = Math.floor(intervalTime%60)//2.設置內容hour1.textContent = hourminute1.textContent = minutesecond1.textContent = second},1000)</script>
</body>
</html>

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

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

相關文章

華為倉頡編程語言的表達式及其特點

華為倉頡編程語言的表達式及其特點 倉頡&#xff08;Cangjie&#xff09;語言的表達式有一個明顯的特點&#xff0c;范圍不再局限于傳統算術運算&#xff0c;而是擴展到條件表達式、循環表達式等多種類型&#xff0c;每種表達式均有確定的類型和值。 傳統基本表達式&#xff0…

【linux】keepalived

一.高可用集群1.1 集群類型LB&#xff1a;Load Balance 負載均衡 LVS/HAProxy/nginx&#xff08;http/upstream, stream/upstream&#xff09; HA&#xff1a;High Availability 高可用集群 數據庫、Redis SPoF: Single Point of Failure&#xff0c;解決單點故障 HPC&#xff…

Webpack配置原理

一、Loader&#xff1a; 1、定義&#xff1a;將不同類型的文件轉換為 webpack 可識別的模塊2、分類&#xff1a; ① pre&#xff1a; 前置 loader &#xff08;1&#xff09;配置&#xff1a;在 webpack 配置文件中通過enforce進行指定 loader的優先級配置&#xff08;2&#x…

對比JS“上下文”與“作用域”

下面從定義、特性、示例&#xff0c;以及在代碼分析中何時側重“上下文”&#xff08;Execution Context/this&#xff09;和何時側重“作用域”&#xff08;Scope/變量查找&#xff09;&#xff0c;以及二者結合的場景來做對比和指導。一、概念對比 | 維度 | 上下文&#xff0…

如何做數據增強?

目錄 1、為什么要做數據增強&#xff1f; 2、圖像數據增強&#xff1f; 3、文本與音頻數據增強&#xff1f; 4、高級數據增強&#xff1f; 數據增強技術就像是一種“造數據”的魔法&#xff0c;通過對原始數據進行各種變換&#xff0c;生成新的樣本&#xff0c;從而提高模型…

Go by Example

網頁地址Go by Example 中文版 Github倉庫地址mmcgrana/gobyexample&#xff1a;按示例進行 HelloWorld package mainimport ("fmt" )func main() {fmt.Println("Hello World") } Hello World 值 package mainimport ("fmt" )func main() {…

ClickHouse高性能實時分析數據庫-消費實時數據流(消費kafka)

告別等待&#xff0c;秒級響應&#xff01;這不只是教程&#xff0c;這是你駕馭PB級數據的超能力&#xff01;我的ClickHouse視頻課&#xff0c;凝練十年實戰精華&#xff0c;從入門到精通&#xff0c;從單機到集群。點開它&#xff0c;讓數據處理速度快到飛起&#xff0c;讓你…

電子電氣架構 --- 車載軟件與樣件產品交付的方法

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

C++:STL中vector的使用和模擬實現

在上一篇中講到了string類&#xff0c;string并不屬于STL中因為string出現的比STL早&#xff0c;但是在使用方法上兩者有相似之處&#xff0c;學習完string后再來看vector會容易的多&#xff0c;接著往下閱讀&#xff0c;一定會有收獲滴&#xff01; 目錄 vector的介紹 vect…

倉庫管理的流程、績效和解決方案?

什么是倉庫管理&#xff1f; 倉庫管理涉及對所有倉庫運營的日常監督。一個全面、集成的倉庫管理解決方案采用行業最佳實踐&#xff0c;并涵蓋使高效運營得以實現的所有基本要素。這些要素包括分銷和庫存管理、倉庫勞動力管理以及業務支持服務。此外&#xff0c;由內部提供或與服…

TIM 實現定時中斷【STM32L4】【實操】

使用定時器實現定時中斷的功能&#xff1a;比如每1ms進入中斷處理函數使用STM32CubeMX配置TIM初始化先了解每個參數的含義&#xff0c;在進行配置Counter Settings: 計數器基本設置Prescaler(PSC): 預分頻器&#xff0c;設置預分頻器系數Counter Mode: 技術模式&#xff0c;…

Elasticsearch 的聚合(Aggregations)操作詳解

目錄 1. 概述 2. 聚合類型分類詳解 2.1 桶聚合&#xff08;Bucket Aggregations&#xff09; 2.1.1 基礎桶聚合 2.1.2 特殊桶聚合 2.1.3 高級桶聚合 2.2 指標聚合&#xff08;Metric Aggregations&#xff09; 2.2.1 單值指標聚合&#xff08;Single-value Metrics&am…

電子電氣架構 --- 高階智能駕駛對E/E架構的新要求

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

0.深度學習環境配置步驟

0.深度學習環境配置步驟 這里介紹深度學習環境配置詳細步驟&#xff0c;包括安裝軟件&#xff0c;每一步都有安裝時的截圖&#xff08;后續持續更新&#xff0c;敬請關注&#xff09; 目錄如下&#xff1a; 1.安裝anaconda 2.安裝CUDA 3.安裝CU_DNN 4.安裝pytorch

在 Azure 中配置 SMS 與 OTP

1. Azure Active Directory B2C (AAD B2C) 中的 SMS/OTP 身份驗證 1.1. 現狀與原理&#xff1a;電話注冊與登錄 Azure Active Directory B2C (AAD B2C) 提供了將電話號碼作為用戶身份標識進行注冊和登錄的功能&#xff0c;旨在為用戶提供一種便捷的替代傳統電子郵件或用戶名登錄…

簡單實現支付密碼的頁面及輸入效果

干我們這行&#xff0c;風吹日曬不到&#xff0c;就怕甲方突發奇想。 今天客戶要做一個安全密碼前置校驗&#xff0c;還要做成支付寶那種效果。ps:android端 心理吐槽了一萬遍以后&#xff0c;還是得面對現實。 先用通義問一遍&#xff0c;給了兩個方案&#xff0c;要么自己寫&…

proxmox 解決docker容器MongoDB創建報錯MongoDB 5.0+ requires a CPU with AVX support

目錄 最簡單直接的方式 測試MongoDB docker compose的安裝shell腳本 驗證訪問 最簡單直接的方式 讓虛擬機直接使用宿主機的物理 CPU 功能標志。 打開 Proxmox Web UI。 選擇你的 VM → 硬件 (Hardware) → CPU → 點擊 編輯 (Edit)。 將 CPU 類型改為 host。 確認并重啟…

向前滾動累加SQL 實現思路

一、業務背景在經營分析場景里&#xff0c;我們經常需要回答&#xff1a;“截至今天&#xff0c;過去 N 天/月/周累計發生了多少&#xff1f;”“把維度切到省、市、房型、項目經理、代理商等&#xff0c;結果又是什么&#xff1f;”本文用兩個真實需求做演示&#xff1a;以天為…

Spring AI(14)——文本分塊優化

RAG時&#xff0c;檢索效果的優劣&#xff0c;和文本的分塊的情況有很大關系。SpringAI中通過TokenTextSplitter對文本分塊。本文對SpringAI提供的TokenTextSplitter源碼進行了分析&#xff0c;并給出一些自己的想法&#xff0c;歡迎大家互相探討。查看了TokenTextSplitter的源…

Python----大模型(RAG 的智能評估-LangSmith)

一、LangSmith LangSmith是LangChain的一個子產品&#xff0c;是一個大模型應用開發平臺。它提供了從原 型到生產的全流程工具和服務&#xff0c;幫助開發者構建、測試、評估和監控基于LangChain 或其他 LLM 框架的應用程序。 安裝 LangSmith pip install langsmith0.1.137 官網…