一、結點
文檔對象模型(Document Object Model),是W3C組織推薦的處理可擴展標記語言的標准編程接口。js的DOM操作可以改變網頁的內容、結構和樣式,可以利用DOM操作來改變元素里面的內容、屬性等。
1、html的DOM樹
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body bgcolor="white">
<h5 align="middle">文字鏈接和圖片鏈接</h5>
<center>
<a href="https://www.baidu.com/" title="百度一下">百度</a><br><br><br><br><br><br>
<a href="https://www.baidu.com/" title="百度一下"><img src="img/百度圖標.png" /></a>
</center>
</body>
</html>
上面的HTML文件可以轉化為如下的DOM樹:

Document: 整個HTML文件稱為一個Document文檔。
Element:標簽稱為Element元素,例如:head、title、body、h5等。
Attribute:標簽里面的屬性,例如:href、title等。
Text:text文本、空格、換行,例如:<h5>之間的文本內容。
Node:Document、Element、Attribute、Text統稱為Node。
2、DOM對象的常用方法:
getElementById() 返回帶有指定 ID的元素 getElementsByTagName() 返回包含帶有指定標簽名稱的所有元素的節點列表(集合/節點數組) getElementsByClassName() 返回包含帶有指定類名的所有元素的節點列表 appendChild() 把新的子節點添加到指定節點 removeChild() 刪除子節點 replaceChild() 替換子節點 insertBefore() 在指定的子節點前面插入新的子節點 createAttribute() 創建屬性節點 createElement() 創建元素節點 createTextNode() 創建文本節點 getAttribute() 返回指定的屬性值 setAttribute() 把指定屬性設置或修改為指定的值
應用舉例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="d1"> </div> <script> var para=document.createElement("p"); var node=document.createTextNode("23日,@電影熊出沒 發布撤檔聲明,
“我們不願看到觀眾朋友們因為觀看《熊出沒·狂野大陸》承擔任何健康風險,更不願看到疫情進一步擴散的可能。
沒有什么比家人和孩子的安全更加重要!我們特此宣布,《熊出沒·狂野大陸》將正式退出春節檔,擇日再映。”"); para.appendChild(node); var element=document.getElementById("d1"); element.appendChild(para); </script> </body> </html>
首先創建段落元素結點,然后創建文本結點,最后將文本結點放入段落中。
3、結點操作(父子節點)
(1)獲取子結點
普通方式:
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
</ul>
<script>
var myul=document.querySelector(".fu");
var myli=document.querySelector(".zi"); </script> </body>
需要分別獲取父節點和子節點
通過結點操作獲取(獲取父節點)
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
</ul>
<script>
var myli=document.querySelector(".zi");
console.log(myli.parentElement);
</script>
</body>
利用父子關系獲取結點
(3)獲取子節點
普通方式:
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
</ul>
<script>
var myul=document.querySelector(".fu");
var lis=myul.querySelectorAll("li");
console.log(lis);
</script>
</body>
結點操作:獲取的是所有的結點
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
</ul>
<script>
var myul=document.querySelector(".fu");
console.log(myul.childNodes);
</script>
</body>

可以通過判斷nodetype獲取需要的結點
獲取所有的子元素節點:
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
</ul>
<script>
var myul=document.querySelector(".fu");
console.log(myul.children);
</script>
</body>
獲取最后一個和第一個元素結點(IE9以上可使用):
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script>
var myul=document.querySelector(".fu");
console.log(myul.firstElementChild);
console.log(myul.lastElementChild)
</script>
</body>

沒有兼容性問題的情況下返回第一個子元素和最后一個子元素:
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script>
var myul=document.querySelector(".fu");
console.log(myul.children[0]);
console.log(myul.children[3])
</script>
</body>
優化:
<body>
<ul class="fu">
<li class="zi">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script>
var myul=document.querySelector(".fu");
console.log(myul.children[0]);
console.log(myul.children[myul.children.length-1])
</script>
</body>
4、結點操作(兄弟結點)
(1)獲取兄弟結點
<body>
<div id="1"></div>
<div id="2"></div>
<span id="3"></span>
<script>
var mydiv=document.getElementById("3")
console.log(mydiv.nextSibling);
console.log(mydiv.previousSibling);
</script>
</body>

因為存在換行,所以兄弟結點都為文本結點
(2)獲取兄弟元素結點
<body>
<div id="1"></div>
<div id="2"></div>
<span id="3"></span>
<script>
var mydiv=document.getElementById("2")
console.log(mydiv.nextElementSibling);
console.log(mydiv.previousElementSibling);
</script>
</body>

二、dom改變結點的內容
1、改變元素內容
(1)element.innerText:從起始位置到終止位置,但它除去html標簽、空格、換行
改變元素內容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>獲取元素</title>
</head>
<body>
<button>獲取時間</button>
<div>hello</div>
<script>
//獲取元素
var btn = document.querySelector("button");
var div = document.querySelector("div");
//注冊事件
btn.onclick = function() {
div.innerText = "2020年7月24日15:58:00";
}
</script>
</body>
</html>

點擊按鈕:

因為script需要獲取標簽,因此將標簽放到最前方,保證能夠先獲取到標簽
不識別標簽:
<body>
<button>獲取時間</button>
<div>hello</div>
<script>
//獲取元素
var btn = document.querySelector("button");
var div = document.querySelector("div");
//注冊事件
btn.onclick = function() {
div.innerText = "<strong>2020年7月24日15:58:00<strong>";
}
</script>
</body>

(2)element.innerHTML:起始位置到終止位置的全部內容,包括html標簽、空格和換行
修改元素內容:
<body>
<button>獲取時間</button>
<div>hello</div>
<script>
//獲取元素
var btn = document.querySelector("button");
var div = document.querySelector("div");
//注冊事件
btn.onclick = function() {
div.innerHTML = "2020年7月24日15:58:00";
}
</script>
</body>

識別元素標簽:
<body>
<button>獲取時間</button>
<div>hello</div>
<script>
//獲取元素
var btn = document.querySelector("button");
var div = document.querySelector("div");
//注冊事件
btn.onclick = function() {
div.innerHTML = "<strong>2020年7月24日15:58:00<strong>";
}
</script>
</body>

不識別鏈接:
<body>
<button>獲取時間</button>
<div>hello</div>
<script>
//獲取元素
var btn = document.querySelector("button");
var div = document.querySelector("div"); //注冊事件 btn.onclick = function() { div.innerHTML = "https://www.cnblogs.com/zhai1997/"; } </script> </body>

為文本,點擊鏈接不能跳轉
2、改變元素的屬性
(1)操作input的屬性
<body>
<button>請點擊</button>
<input type="text" value="請輸入"/>
<script>
//獲取元素
var btn = document.querySelector("button");
var input = document.querySelector("input");
//注冊事件
btn.onclick = function() {
input.value="被點擊了";
btn.disabled=true;
}
</script>
</body>
點擊前:

點擊后:

(2)src的屬性
<body>
<button id="button1">1</button>
<button id="button2">2</button>
<img src="img/1.jpeg" />
<script>
//獲取元素
var btn1 = document.getElementById("button1");
var btn2= document.getElementById("button2");
var img=document.querySelector("img");
//注冊事件
btn1.onclick = function() {
img.src="img/hua.png"
}
btn2.onclick=function(){
img.src="img/1.jpeg";
}
</script>
</body>
點擊按鈕1:

點擊按鈕2:

(3)密碼明文
<body>
<button id="button">1</button>
<input type="password" id="pwd"/>
<script>
var button =document.getElementById("button");
var pwd=document.getElementById("pwd");
var flag=0;
button.onclick=function(){
if(flag==0){
pwd.type="text";
}else{
pwd.type="password";
}
}
</script>
</body>
未點擊按鈕:

點擊按鈕:

3、改變樣式
(1)普通方式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
div{
width: 200px;
height: 200px;
background-color: black;
}
</style>
</head>
<body>
<div></div>
<script>
var div=document.querySelector("div");
div.onclick=function(){
this.style.backgroundColor="red";
}
</script>
</body>
</html>
點擊按鈕前:

點擊后:

(2)className方式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
.change{
width: 200px;
height: 200px;
background-color: black;
}
</style>
</head>
<body>
<div>hello</div>
<script>
var div=document.querySelector("div");
div.onclick=function(){
this.className="change";
}
</script>
</body>
</html>
點擊前:

點擊后:加載相應的樣式

此種方式會覆蓋原有的樣式,如果要保留原有的樣式,可以將原有的樣式寫在前面,修改后的樣式寫在后面
