【JavaScript實用技巧(二)】Js操作DOM(由問題引發的文章改版,新人大佬都可)


【JavaScript實用技巧(二)】Js操作DOM(由問題引發的文章改版,新人大佬都可!)

博客說明

文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗匯總,如有什么地方侵權,請聯系本人刪除,謝謝!

說明

這片文章的來源是更改之前的一個筆記,是獲取js獲取input標簽的值,當時只是講了這個例子,當然下面這個例子依然保留,畢竟要在乎老用戶的感受,屬於增量需求。

由當時的一個例子看來,需要總結或者說學習的點還是比較多的。

新人可能只想解決某個問題,而大佬麻煩看看總結的還有哪里需要補充說明的。

js獲取input標簽里面的值

需求

有的時候我們需要獲得在input里面的一些值,比如在發送手機驗證碼的時候,首先在html里面寫以下的代碼

代碼

html 一個簡單的input標簽

<input type="text" name="name" id="phone" /> 

js 獲取input標簽的值

var phone = document.getElementById("phone").value;
說明

看上面的代碼,就是使用的DOM的API獲取到input標簽的值。既然可以獲取到,那么DOM也提供了相應更改或者說替換的API,而DOM是可以在JS中執行的,那么JS和HTML的交互就來了。

一次勾搭上,那以后的花樣還能少?

所以各種模版引擎,響應式,JS動畫那不就紛至沓來了。

是不是感覺高深的東西就要來了,不急,回到主題,本章主要講JS操作DOM。

JS的能力

在講JS操作DOM的時候,感覺有必要先講一下JS的能力。

下面是對象的 HTML DOM 樹,圖來自W3C,https://www.w3school.com.cn/js/js_htmldom.asp

image-20211103000848461

通過這個對象模型,JavaScript 獲得創建動態 HTML 的所有力量:

  • JavaScript 能改變頁面中的所有 HTML 元素
  • JavaScript 能改變頁面中的所有 HTML 屬性
  • JavaScript 能改變頁面中的所有 CSS 樣式
  • JavaScript 能刪除已有的 HTML 元素和屬性
  • JavaScript 能添加新的 HTML 元素和屬性
  • JavaScript 能對頁面中所有已有的 HTML 事件作出反應
  • JavaScript 能在頁面中創建新的 HTML 事件

看到上面的內容,感覺就是會用js,你啥都能做,啥都能改。這種別被產品看到了,不然有些需求你頂不死,推不下。

DOM的了解

既然是JS操作DOM,那么首先是需要熟悉DOM,正好前面寫了一篇關於DOM的文章,【瀏覽器】聊聊DOM

操作DOM的常用方法

方法 描述
getElementById() 返回帶有指定 ID 的元素。
getElementsByTagName() 返回包含帶有指定標簽名稱的所有元素的節點列表(集合/節點數組)。
getElementsByClassName() 返回包含帶有指定類名的所有元素的節點列表。
appendChild() 把新的子節點添加到指定節點。
removeChild() 刪除子節點。
replaceChild() 替換子節點。
insertBefore() 在指定的子節點前面插入新的子節點。
createAttribute() 創建屬性節點。
createElement() 創建元素節點。
createTextNode() 創建文本節點。
getAttribute() 返回指定的屬性值。
setAttribute() 把指定屬性設置或修改為指定的值。

獲取DOM的節點

getElementsByTagName():根據元素名稱獲取元素對象們。返回值是一個數組。

getElementsByClassName():根據Class屬性值獲取元素對象們。返回值是一個數組。

getElementsByName():根據name屬性值獲取元素對象們。返回值是一個數組。

獲取Element(節點)的方法最常見的就是以上的四種

getElementById()

根據id屬性值獲取元素對象。id屬性值一般唯一。

如果需要查找文檔中的一個特定的元素,最有效的方法是 getElementById(),在操作文檔的一個特定的元素時,最好給該元素一個 id 屬性(不然你以為為什么叫ById),為它指定一個(在文檔中)唯一的名稱,然后就可以用該 ID 查找想要的元素。

示例:

<html>
<head>
<script type="text/javascript">
function getValue(){
  var x = document.getElementById("test")
  alert(x.innerHTML)
}
</script>
</head>
<body>

<h1 id="test" onclick="getValue()">我的</h1>
<p>點擊我的,看看效果</p>

</body>
</html>

效果:

image-20211112224558322

代碼解析:

通過getElementById獲取元素id為test的節點,然后打印test節點的文本。

下圖就是獲取的html節點

image-20211112224836440

getElementsByClassName()

getElementsByClassName() 方法返回文檔中所有指定類名的元素集合,作為 NodeList 對象。

NodeList 對象代表一個有順序的節點列表。NodeList 對象 我們可通過節點列表中的節點索引號來訪問列表中的節點(索引號由0開始)。

示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>測試</title>
<style>
.example {
    border: 1px solid black;
    margin: 5px;
}
</style>
</head>
<body>

<div class="example">
  <p>我是第一個</p>
</div>
<div class="example color">
  <p>我是第二個</p>
</div>
<div class="example color">
  <p>我是第三個</p>
</div>
<button onclick="myFunction()">點我看效果</button>
<script>
function myFunction() {
    var x = document.getElementsByClassName("color");
    x[0].style.backgroundColor = "red";
  	console.log(x)
}
</script>

</body>
</html>

效果:

image-20211112225919073

代碼解析:

通過getElementsByClassName獲取到class屬性為“color”的對象,結果值NodeList 對象,表示指定類名的元素集合。元素在集合中的順序以其在代碼中的出現次序排序。給第一個設置背景顏色為紅色。

注意: Internet Explorer 8 及更早 IE 版本不支持 getElementsByClassName() 方法

插入DOM節點

插入節點有兩種方式,它們的含義是不同的。

appendChild()

父節點的最后插入一個新的子節點。

 父節點.appendChild(新的子節點);
insertBefore()
  • 在參考節點前插入一個新的節點。
  • 如果參考節點為null,那么他將在父節點最后插入一個子節點。
父節點.insertBefore(新的子節點,作為參考的子節點);

示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>

<ul id="list">
  <li>第一</li>
  <li>第二</li>
</ul>
<p id="demo">單擊按鈕將項目添加到列表中</p>
<button onclick="myFunction1()">點我,后面新增</button>
  <button onclick="myFunction2()">點我,前面新增</button>
<script>
function myFunction1(){
	var node = document.createElement("LI");
	var textnode = document.createTextNode("我是新加的");
	node.appendChild(textnode);
	document.getElementById("list").appendChild(node);
}
  
function myFunction2(){
	var node = document.createElement("LI");
	var textnode = document.createTextNode("我是新加的");
	node.appendChild(textnode);
  var list = document.getElementById("list")
	list.insertBefore(node, list.childNodes[0]);
}
</script>

</body>
</html>

效果:

image-20211112232023788

刪除節點

removeChild()

必須要指定是刪除哪個子節點

  父節點.removeChild(子節點);

如果需要刪除節點本身

node.parentNode.removeChild(node);

示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>

<ul id="list">
  <li>第一</li>
  <li>第二</li>
</ul>
<p id="demo">單擊按鈕將項目添加到列表中</p>
<button onclick="myFunction1()">點我,后面新增</button>
  <button onclick="myFunction2()">點我,前面新增</button>
  <button onclick="myFunction3()">點我,刪除第一個節點</button>
<script>
function myFunction1(){
	var node = document.createElement("LI");
	var textnode = document.createTextNode("我是新加的");
	node.appendChild(textnode);
	document.getElementById("list").appendChild(node);
}
  
function myFunction2(){
	var node = document.createElement("LI");
	var textnode = document.createTextNode("我是新加的");
	node.appendChild(textnode);
  var list = document.getElementById("list")
	list.insertBefore(node, list.childNodes[0]);
}
  
function myFunction3(){
  var list = document.getElementById("list")
	list.removeChild(list.childNodes[0]);
}
  
</script>

</body>
</html>

效果:

image-20211112232536199

復制節點(克隆節點)

cloneNode()

克隆節點

要復制的節點.cloneNode();       
要復制的節點.cloneNode(true);

括號里帶不帶參數,效果是不同的。

  • 不帶參數/帶參數false:只復制節點本身,不復制子節點。
  • 帶參數true:既復制節點本身,也復制其所有的子節點。

示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>

<ul id="list">
  <li>第一</li>
  <li>第二</li>
</ul>
<button onclick="myFunction()">點我,克隆節點</button>

<script>
  
function myFunction(){
	var itm = document.getElementById("list");
	var cln = itm.cloneNode(true);
	document.getElementById("list").appendChild(cln);
}
  
</script>

</body>
</html>

效果:

image-20211112233203894

設置節點的屬性

主要也是獲取,修改和刪除

獲取節點的屬性值
元素節點.屬性;
元素節點[屬性];

節點.getAttribute("屬性名稱");

前者是直接操作標簽,后者是把標簽作為DOM節點。

設置節點的屬性值
myNode.src = "xxxx"   //修改src的屬性值
myNode.className = "xxxx";  //修改class的name
    
元素節點.setAttribute(屬性名, 新的屬性值);

前者是直接操作標簽,后者是把標簽作為DOM節點。

刪除節點的屬性
元素節點.removeAttribute(屬性名);
總結

推薦使用DOM節點,不要直接操作標簽。

感謝

萬能的網絡

菜鳥教程

以及勤勞的自己,個人博客GitHub測試GitHub

公眾號-歸子莫,小程序-小歸博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM