一、DOM文檔對象模型
通常將DOM看作一顆“樹”,DOM將整個文檔看作一顆“家譜樹 ”
二、對象
- 用戶定義的對象
- 內建對象(Array、Date、Math)
- 宿主對象
三、節點 node
- 元素節點(element node)
- 文本節點(text node)
- 屬性節點
獲取元素節點的方式
<div id="classList"></div>
<ul><li class="item"></li><li class="item"></li><li></li>
</ul>
//獲取元素節點的方式
//1.document.getElementById()
let eleNode = document.getElementById("classList") //單個對象
console.log(eleNode)
//2.document.getElementsByTagName()
let olis = document.getElementsByTagName("li") //獲取出來的是一個節點對象的集合,像數組(但實際并不是數組,不可以使用數組方法 )
console.log(olis)
//3.document.getElementsByClassName()
let item = document.getElementsByClassName("item") //獲取出來的是一個節點對象的集合
console.log(item)
1. getAttribute和setAttribute
a. getAttribute獲取屬性值,有一個必須的參數,這個節點對象的名字
<p title="你好">請選擇序號</p>
var oP = document.getElementsByTagName('p')[0]//獲取屬性值 有一個必須的參數,這個節點對象的名字var title = oP.getAttribute("title");var className = oP.getAttribute("class");console.log(title) //你好console.log(className) //null 不存在
b. 設置屬性值setAttribute(name,value)
<p title="你好">請選擇序號</p>
#box {color: red;}
//獲取元素的節點
var oP = document.getElementsByTagName('p')[0]
//設置屬性值setAttribute(name,value)
oP.setAttribute("id", "box")
3.節點對象的屬性
3.1三個重要屬性
在文檔對象模型(DOM)中,每一個節點都是一個對象。DOM節點有三個重要屬性:
- nodeName : 節點的名稱 只讀
● 元素節點的nodeName與標簽相同
● 屬性節點的nodeName與屬性名稱相同
● 文本節點的nodeName永遠是#text
● 文檔節點的nodeNamenodeName永遠是#document - nodeValue : 節點的值
● 元素節點的nodeValue是undefined或null
● 文本節點的nodeValue是文本自身
● 屬性節點的nodeValue是屬性的值 - nodeType :節點的類型 只讀
以下常用的幾種節點類型:
<!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></style>
</head><body><div id="box" title="我是文本">我是一個文本節點<!-- 這是注釋 --></div><script>//元素節點var oDiv = document.getElementById("box")console.log(oDiv.nodeName) //DIVconsole.log(oDiv.nodeValue) //nullconsole.log(oDiv.nodeType) //1//獲取屬性節點console.log(oDiv.attributes);var attrNode = oDiv.attributes[0];console.log(attrNode.nodeName)console.log(attrNode.nodeValue)console.log(attrNode.nodeType)//獲取文本節點var textNode = oDiv.childNodes[0]console.log(textNode.nodeName)console.log(textNode.nodeValue)console.log(textNode.nodeType)//注釋節點console.log(oDiv.childNodes)var commentNOde = oDiv.childNodes[1]console.log(commentNOde.nodeName)console.log(commentNOde.nodeValue)console.log(commentNOde.nodeType)//文檔節點console.log(document.nodeType); //9</script>
</body></html>
3.2其他屬性
- childNodes 獲取其子節點
- firstChild 獲取第一個子節點
- lastChild 獲取最后一個子節點
- parentNode 獲取父級子節點
- nextSibling 獲取下一個兄弟元素節點
- previousSibling 獲取上一個兄弟元素節點
3.2.1childNodes
此屬性用于獲取其子節點
<!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></style>
</head><body><div id="father"><p>你好!js</p><p>你好!Html</p></div><script>var oFather = document.getElementById("father");console.log(oFather.childNodes);</script>
</body></html>
打印的結果如下,這時候發現本來我們的father盒子中只有兩個p標簽,為什么會多出text,這個text是什么?
我們來打印以下他的節點類型,看一下text是什么類型
<!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></style>
</head><body><div id="father"><p>你好!js</p><p>你好!Html</p></div><script>var oFather = document.getElementById("father");console.log(oFather.childNodes);console.log(oFather.childNodes[0].nodeType); //3</script>
</body></html>
打印結果是3,對應上面所說的文本節點,顯而易見我們并沒有寫文本,那是因為我們標簽之間有空格,空格也屬于文本類型。如果我們不想要這個文本節點,那么就將代碼寫成一行就可以了。
但是如果我們的代碼都寫成一行,這樣會導致代碼結構不清晰。
<div id="father"><p>你好!js</p><p>你好!Html</p></div>
那么下面我們來處理一下元素之間有空格的問題,這里我們來封裝一個函數來處理一下:
節點對象在各個瀏覽器兼容性處理:
在此函數當中判斷拿到的節點是否是元素節點,如果是那么就添加到新數組中,將新數組返回。
function get_childNodes(fatherNode) {let nodes = fatherNode.childNodes;let arr = [];for (let i = 0; i < nodes.length; i++) {if (nodes[i].nodeType === 1) {arr.push(nodes[i])}}return arr;
}
let childNodes = get_childNodes(oFather)
console.log(childNodes)
3.2.2 firstChild 子節點中的第一個節點
<!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></style>
</head><body><div id="father"><p>你好!js</p><p>你好!Html</p></div><script>var oFather = document.getElementById("father");console.log(oFather.childNodes);console.log(oFather.childNodes[0].nodeType); //3\console.log(oFather.firstChild) //等價于console.log(oFather.childNodes[0])</script>
</body></html>
3.2.3 lastChild子節點中的最后一個節點
<!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></style>
</head><body><div id="father"><p>你好!js</p><p>你好!Html</p></div><script>var oFather = document.getElementById("father");console.log(oFather.childNodes);console.log(oFather.childNodes[0].nodeType); //3\console.log(oFather.firstChild) //等價于console.log(oFather.childNodes[0])console.log(oFather.lastChild) //等價于console.log(oFather.childNodes[oFather.childNodes.length-1])</script>
</body></html>
3.2.4 parentNode 獲取元素節點的父節點
<!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></style>
</head><body><div id="father"><p>你好!js</p><p>你好!Html</p></div><script>var oFather = document.getElementById("father");console.log(oFather.childNodes);console.log(oFather.childNodes[0].nodeType); //3\console.log(oFather.firstChild) //等價于console.log(oFather.childNodes[0])console.log(oFather.lastChild) //等價于console.log(oFather.childNodes[oFather.childNodes.length-1])console.log(oFather.parentNode) //獲取oFather.parentNode的父級元素</script>
</body></html>
在這里就是獲取father這個節點的父節點,也就是body這個元素節點。
3.2.5 nextSibling 獲取下一個兄弟元素節點
<!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></style>
</head><body><div id="father"><p>你好!js</p><p>你好!Html</p></div><div class="next">下一個兄弟元素</div><script>var oFather = document.getElementById("father");console.log(oFather.childNodes);console.log(oFather.childNodes[0].nodeType); //3\console.log(oFather.firstChild) //等價于console.log(oFather.childNodes[0])console.log(oFather.lastChild) //等價于console.log(oFather.childNodes[oFather.childNodes.length-1])console.log(oFather.parentNode) //獲取oFather.parentNode的父級元素console.log(oFather.nextSibling);//獲取下一個兄弟元素</script>
</body></html>
注意,這里兄弟元素之間同樣不能有空格,否則獲取出來的是text,文本節點。
同樣的這里我們也可以通過封裝函數來處理此問題:
首先將獲取到的father作為參數傳入,后判斷節點類型是否是元素節點,否則將一直查找,直到查找到的元素節點類型為1停止。(同樣的previousSibling也可以使用此函數,只需要將屬性改為previousSibling即可)
function get_nextSilbling(n) {let x = n.nextSibling;while (x && x.nodeType != 1) {x = x.nextSibling;}return x;}
console.log(get_nextSilbling(oFather))
3.2.6 previousSibling 獲取上一個兄弟元素
<!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></style>
</head><body><div>上一個兄弟元素</div><div id="father"><p>你好!js</p><p>你好!Html</p></div><div class="next">下一個兄弟元素</div><script>var oFather = document.getElementById("father");console.log(oFather.childNodes);console.log(oFather.childNodes[0].nodeType); //3\console.log(oFather.firstChild) //等價于console.log(oFather.childNodes[0])console.log(oFather.lastChild) //等價于console.log(oFather.childNodes[oFather.childNodes.length-1])console.log(oFather.parentNode) //獲取oFather.parentNode的父級元素console.log(oFather.nextSibling);//獲取下一個兄弟元素console.log(oFather.previousSibling);//獲取上一個兄弟元素</script>
</body></html>
這里與nextSibling獲取下一個兄弟節點的屬性相同,不能有空格。
4. 節點的方法
4.1 創建節點createElement()
<!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></style>
</head><body><div class="box"><p class="active">Javascript</p></div><script>let newNode = document.createElement("p");//創建一個p標簽</script>
</body></html>
4.2 插入節點appendChild()
<!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></style>
</head><body><div class="box"><p class="active">Javascript</p></div><script>let oDiv = document.querySelector(".box");let newNode = document.createElement("p");//創建一個p標簽oDiv.appendChild(newNode);//將新創建的節點插入到div當中</script>
</body></html>
這樣就可以看到使用appendChild()方法可以將新創建的節點插入到div中,在已有元素后
但是現在還沒有內容,這時候我們就可以使用creatTextNode()方法來創建文本節點。
4.3 創建文本節點creatTextNode()
<!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></style>
</head><body><div class="box"><p class="active">Javascript</p></div><script>let oDiv = document.querySelector(".box");let newNode = document.createElement("p");//創建一個p標簽oDiv.appendChild(newNode);//將新創建的節點插入到div當中let textNode=document.createTextNode("我是文本節點的內容")newNode.appendChild(textNode); //將文本節點插入到新創建的節點當中</script>
</body></html>
這個有助于理解,平常我們不使用這兩種方法,而是使用innerHTML這個屬性用于向節點當中插入內容
<!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></style>
</head><body><div class="box"><p class="active">Javascript</p></div><script>let oDiv = document.querySelector(".box");let newNode = document.createElement("p");//創建一個p標簽oDiv.appendChild(newNode);//將新創建的節點插入到div當中// let textNode=document.createTextNode("我是文本節點的內容")// newNode.appendChild(textNode); //將文本節點插入到新創建的節點當中// newNode.innerHTML = '<a href='#'>我是文本節點的內容</a>';//可以插入文本,也可以插入標簽newNode.innerText = '<a href='#'>我是文本節點的內容</a>';//此方法不可以渲染標簽</script>
</body></html>
在這里雖然我們已經使用了newNode這個對象,但實際還在內存當中,我們可以將其釋放
<!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></style>
</head><body><div class="box"><p class="active">Javascript</p></div><script>let oDiv = document.querySelector(".box");let newNode = document.createElement("p");//創建一個p標簽oDiv.appendChild(newNode);//將新創建的節點插入到div當中// let textNode=document.createTextNode("我是文本節點的內容")// newNode.appendChild(textNode); //將文本節點插入到新創建的節點當中// newNode.innerHTML = '<a href='#'>我是文本節點的內容</a>';//可以插入文本,也可以插入標簽newNode.innerText = '<a href='#'>我是文本節點的內容</a>';//此方法不可以渲染標簽newNode = null; //釋放對象</script>
</body></html>
4.4 在指定元素之前插入節點 insertBefore(newNode,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><style></style>
</head><body><div class="box"><p class="active">Javascript</p></div><script>let oDiv = document.querySelector(".box");let oP =document.querySelector(".active");let newNode = document.createElement("p");//創建一個p標簽let newNode2 = document.createElement("p");//第一個參數是插入的節點,第二個參數參考的節點oDiv.insertBefore(newNode2,oP)oDiv.appendChild(newNode);//將新創建的節點插入到div當中// let textNode=document.createTextNode("我是文本節點的內容")// newNode.appendChild(textNode); //將文本節點插入到新創建的節點當中// newNode.innerHTML = '<a href="#">我是文本節點的內容</a>';//可以插入文本,也可以插入標簽newNode.innerText = '<a href="#">我是文本節點的內容</a>';//此方法不可以渲染標簽newNode = null; //釋放對象,注意釋放對象一定要在其使用完畢之后再進行釋放newNode2.innerHTML = "<a href='#'>我是在節點之前創建的文本節點的內容</a>"</script>
</body></html>
4.5 刪除節點removeChild(childNode)
<!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></style>
</head><body><div class="box"><p class="active">Javascript</p></div><script>let oDiv = document.querySelector(".box");let oP = document.querySelector(".active");let newNode = document.createElement("p");//創建一個p標簽let newNode2 = document.createElement("p");//第一個參數是插入的節點,第二個參數參考的節點oDiv.insertBefore(newNode2, oP)oDiv.appendChild(newNode);//將新創建的節點插入到div當中// let textNode=document.createTextNode("我是文本節點的內容")// newNode.appendChild(textNode); //將文本節點插入到新創建的節點當中// newNode.innerHTML = '<a href='#'>我是文本節點的內容</a>';//可以插入文本,也可以插入標簽newNode.innerText = '<a href="#">我是文本節點的內容</a>';//此方法不可以渲染標簽newNode = null; //釋放對象,注意釋放對象一定要在其使用完畢之后再進行釋放newNode2.innerHTML = "<a href='#'>我是在節點之前創建的文本節點的內容</a>"oDiv.removeChild(oP)</script>
</body></html>
4.6 替換節點replaceChild(newNode,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><style></style>
</head><body><div class="box"><p class="active">Javascript</p></div><script>let oDiv = document.querySelector(".box");let oP = document.querySelector(".active");let newNode = document.createElement("p");//創建一個p標簽let newNode2 = document.createElement("p");let newNode3 = document.createElement("a") //創建一個a標簽newNode3.setAttribute("href", "https://www.baidu.com") //設置a標簽的屬性newNode3.innerHTML = "百度一下" //設置a標簽的內容//第一個參數是插入的節點,第二個參數參考的節點oDiv.insertBefore(newNode2, oP)oDiv.appendChild(newNode);//將新創建的節點插入到div當中oDiv.replaceChild(newNode3, oP)// let textNode=document.createTextNode("我是文本節點的內容")// newNode.appendChild(textNode); //將文本節點插入到新創建的節點當中// newNode.innerHTML = '<a href='#'>我是文本節點的內容</a>';//可以插入文本,也可以插入標簽newNode.innerText = '<a href="#">我是文本節點的內容</a>';//此方法不可以渲染標簽newNode = null; //釋放對象,注意釋放對象一定要在其使用完畢之后再進行釋放newNode2.innerHTML = "<a href='#'>我是在節點之前創建的文本節點的內容</a>"// oDiv.removeChild(oP)</script>
</body></html>
四、動態操作樣式
1.直接操作樣式屬性
<!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><p id="box">張三</p><script type="text/javascript">//nodeObj.stylelet oP = document.getElementById("box");console.log(oP.style) //1. 直接操作樣式屬性oP.style.color = "red";oP.style.backgroundColor = 'black';oP.style.width = "250px";oP.style.height = "250px";</script>
</body></html>
獲取對應的節點對象上的屬性,調用style屬性時會將添加的屬性添加到行內
2.通過控制屬性的類名來控制樣式
<!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>.active {width: 250px;height: 150px;color: red;background: black;}</style>
</head><body><p id="box">張三</p><script type="text/javascript">//nodeObj.stylelet oP = document.getElementById("box");//2. 通過控制屬性的類名來控制樣式oP.setAttribute("class", "active")</script>
</body></html>
五、事件
1. onclick事件
<!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 {width: 100px;height: 100px;background-color: aqua;}</style>
</head><body><div id="box" onclick="active()"></div><script>let box = document.getElementById("box");//1.操作DOM元素// box.onclick = function () {// this指向了當前的元素節點對象// alert("事件被觸發了");// }//2.在元素上添加事件function active(){//this指向了當前元素的元素節點對象// this.style.backgroundColor = 'red'box.style.backgroundColor = 'red'}</script>
</body></html>
2.onmouseover()和onmouseout()事件
<!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 {width: 100px;height: 100px;background-color: aqua;}</style>
</head><body><div id="box"></div><script>let box = document.getElementById("box");// 鼠標滑過事件box.onmouseover = function () {this.style.backgroundColor = "green"}// 鼠標移開事件box.onmouseout = function () {this.style.backgroundColor = "aqua"}</script>
</body></html>
3. 表單控件上的事件
<!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>.active {color: red;font-size: 12px;}</style>
</head><body><form action=""><p class="name"><label for="username">用戶名:</label><input type="text" name="user" id="username"></p><p class="pwd"><label for="pwd">密碼:</label><input type="password" name="pwd" id="pwd"></p><input type="submit" name=""></form><script>let userName = document.getElementById("username");let newNOde = document.createElement("span");// 表單聚焦事件userName.onfocus = function () {// console.log("請輸入用戶名")newNOde.innerHTML = "請輸入用戶名";newNOde.setAttribute("class", "active")userName.parentNode.appendChild(newNOde);}// 表單失焦事件userName.onblur = function () {// console.log("請輸入用戶名")newNOde.innerHTML = "請輸入正確的用戶名";newNOde.setAttribute("class", "active")userName.parentNode.appendChild(newNOde);}</script>
</body></html>
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></style>
</head><body><textarea cols="30" rows="10" name="" id="">請寫入個人簡介,不少于200字</textarea><input type="text" value="123"><script>let text = document.getElementsByTagName("textarea")[0];let ipt = document.getElementsByTagName("input")[0];// 內容選中事件text.onselect = function () {console.log("內容被選中")}// 內容改變事件ipt.onchange = function () {console.log("內容被改變了")}// input框內容改變事件ipt.oninput = function () {console.log("內容被實時的改變了")// 實時監聽input中的內容console.log(this.value)}</script>
</body></html>
5. 窗口加載事件
在之前我們一直將script代碼寫在body當中,如果將代碼寫在head標簽當中會怎么樣?
下面的代碼是將script標簽寫在body標簽當中,給box盒子添加了一個點擊事件。
<!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 id="box">你好!</div><script>let box = document.getElementById("box")box.onclick = function () {this.innerHTML = "javaScript!"}</script>
</body></html>
在這次的代碼中,將script代碼寫進head標簽當中
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script>let box = document.getElementById("box");console.log(box);box.onclick = function () {this.innerHTML = "javaScript!";}</script>
</head><body><div id="box">你好!</div>
</body></html>
此時我們就會發現,放進head標簽當中的js代碼報錯了,打印了我們拿到的DOM元素顯示為null。也就是拿到的DOM元素有誤。
原因如下:
- 腳本在 中執行時,文檔的 DOM 結構還沒有加載完成
- document.getElementById(“box”) 試圖獲取 ID 為 “box” 的元素,但此時 還沒有被瀏覽器解析和創建
- 因此 box 變量會是 null,后續對 null 調用 onclick 就會導致錯誤
解決方案:
通過設置延時器,等待DOM結構加載:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script>setTimeout(function () {let box = document.getElementById("box");console.log(box);box.onclick = function () {this.innerHTML = "javaScript!";}}, 0)</script>
</head><body><div id="box">你好!</div>
</body></html>
上面的代碼當中,我們設置了延時時間為0,同樣的也可以設置為2000毫秒,1000毫秒,那么具體要設置為多少,這里我們并不清楚,這時候就可以使用窗口加載事件,等待DOM元素加載完成以后再執行我們的js代碼:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script>// 等待文檔加載完成之后才會調用onload()window.onload = function () {let box = document.getElementById("box");console.log(box);box.onclick = function () {this.innerHTML = "javaScript!";}}</script>
</head><body><div id="box">你好!</div>
</body></html>
但是使用onload()方法有一個弊端就是,onload()方法會覆蓋之前的事件,例如下面的代碼,在重新調用onload方法時,之前的代碼不會再次執行。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script>// 等待文檔加載完成之后才會調用onload()window.onload = function () {let box = document.getElementById("box");console.log(box);box.onclick = function () {this.innerHTML = "javaScript!";}}// window.onload 會有覆蓋行為,之前的代碼不會執行window.onload = function () {console.log("111")}</script>
</head><body><div id="box">你好!</div>
</body></html>
6. DOMContentLoaded事件
上面代碼中我們使用窗口加載事件,使放在head標簽當中的代碼可以正常運行,這里我們可以使用DOMContentLoaded事件,使代碼可以正常運行。DOMContentLoaded 是瀏覽器提供的一個事件,它會在 HTML 文檔完全解析(DOM 樹構建完成) 時觸發,而無需等待樣式表、圖片等外部資源加載完成。
<head><script>document.addEventListener("DOMContentLoaded", function() {let box = document.getElementById("box");console.log(box);box.onclick = function () {this.innerHTML = "javaScript!";}});</script>
</head>
六、結束語
本節關于DOM的學習就到此結束了,后續我們會繼續學習一下BOM。最后不要忘記點贊加關注哦~