DOM擴展
選擇符API
querySelector()
var myDiv = document.getElementById("myDiv");
現在,使用querySelector()來獲取該元素:
var myDiv = document.querySelector("#myDiv");
通過元素本身,來獲取該元素,用傳統的方法:
var div = document.getElementsByTagName("div");
var div = document.getElementsByTagName("div")[0];
現在,使用querySelector()來獲取第一個與模式匹配的元素:
var div = document.querySelector("div")
同樣的,也可以獲取類名爲selected的第一個元素(因爲類名selected的元素可以有很多):
//取得類爲selected的第一個元素
var selected = document.querySelector(".selected");
注:通過Document類調用querySelector()方法時,會在文檔元素的範圍內查找匹配的元素。而通過Element類調用querySelector()調用時,會在當前元素的子元素範圍內查找匹配的元素。
querySelectorAll()
//第一種方法獲取所有的div元素
var div = document.getElementsByTagName("div");
//第二種方法獲取所有的div元素
var div = document.querySelectorAll("div");
元素遍歷
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<ul id="ul_list">
<li>PHP</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
<script>
//通過ID獲取ul元素
var ul = document.querySelector("#ul_list");
//獲取ul下的所有子節點
var childNodes = ul.childNodes;
console.log(childNodes.length);
//獲取ul下的第一個子節點
var firstChild = ul.firstChild;
console.log(firstChild.nodeName); //#text
//獲取ul下的最後一個子節點
var lastChild = ul.lastChild;
console.log(lastChild.nodeName); //#text
</script>
</body>
</html>
- childElmentCount:返回子節點(不包括註釋節點和元素之間的文本節點)的個數。
- firstElementChild:返回第一個子節點。是firstChild的元素版
- lastElementChild:返回最後一個子節點。是lastChild的元素版
- perviousElementSibling:指向前一個同輩節點,perviousChild的元素版
- nextElementSibling:指向後一個同輩節點,nextChild的元素版
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<ul id="ul_list">
<li>PHP</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
<script>
//通過ID獲取ul元素
var ul = document.querySelector("#ul_list");
//獲取ul下的所有子節點
var childNodes = ul.childElementCount;
console.log(childNodes); //3
//獲取ul下的第一個子節點
var firstChild = ul.firstElementChild;
console.log(firstChild.nodeName); //LI
console.log(firstChild);
//獲取ul下的最後一個子節點
var lastChild = ul.lastElementChild;
console.log(lastChild.nodeName); //LI
console.log(lastChild);
//獲取前一個同輩節點
var previousChild = ul.firstElementChild.previousElementSibling;
console.log(previousChild); //null
//獲取後一個同輩節點
var nextChild = ul.lastElementChild.nextElementSibling;
console.log(nextChild); //null
</script>
</body>
</html>
HTML5
與類相關的擴充
document.getElementsByClassName()
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<div class="div1">div1</div>
<div class="div1">div2</div>
<script>
var div = document.getElementsByClassName("div1");
div[0].style.backgroundColor = "red";
</script>
</body>
</html>
效果:
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<div class="div1">div1</div>
<div class="div1">div2</div>
<script>
var div = document.querySelectorAll(".div1");
div[0].style.backgroundColor = "red";
</script>
</body>
</html>
效果一樣:
classList屬性
- add(value):將給定的類字符串添加到列表中,如果列表中已經存在該字符串,則不用添加了。
- remove(value):將給定的類字符串從列表中刪除。
- contains(value):確定列表中是否有給定的類字符串,有返回true,沒有返回false。
- toggle(value):如果列表中沒有給定的類字符串,將它添加到列表中,如果列表中有給定的類字符串,則從列表中刪除它。
- length:返回獲取元素類名的個數。
- item(index):獲取指定索引的類名。
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
.div1 {
color: red;
}
.div2 {
background-color: blue;
}
.div3 {
color: yellow;
}
</style>
</head>
<body>
<div class="div1">測試classList屬性</div> <br>
<input id="sub" type="submit" value="切換類名">
<script>
var div = document.querySelector("div");
var sub = document.querySelector("#sub");
//刪除"div1"類
div.classList.remove("div1");
//添加"div2"類
div.classList.add("div2");
//檢查是否有"div3"這個類
console.log(div.classList.contains("div3"));
//通過點擊事件來切換"div3"類
sub.onclick = function (event) {
div.classList.toggle("div3");
console.log(div.classList.contains("div3")); //時時判斷div是否有"div3"這個樣式
};
</script>
</body>
</html>
焦點管理
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
</style>
</head>
<body>
<input id="inp" type="text">
<script>
var inp = document.querySelector("#inp");
//當輸入框獲取焦點時,判斷activeElment是否引用了輸入框
inp.onfocus = function () {
console.log(document.activeElement === inp);
console.log(document.hasFocus());
}
</script>
</body>
</html>
效果:
HTMLDocument的變化
readyState屬性
兼容模式
head屬性
var head = document.head || document.getElementsByTagName("head")[0];
一個文檔中,只有一個<head>元素。
字符集屬性
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
</style>
</head>
<body>
<input id="inp" type="text">
<script>
//得到charset
console.log(document.charset);
//引用head元素
console.log(document.head);
</script>
</body>
</html>
效果:
自定義數據類型
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
</style>
</head>
<body>
<div id="myDiv" data-app="123" data-name="tom">myDiv</div>
<script>
var myDiv = document.querySelector("#myDiv");
//取得自定義的非標準屬性值
var app = myDiv.dataset.app;
var name = myDiv.dataset.name;
console.log(app);
console.log(name);
//修改這些非標準屬性值
myDiv.dataset.app = 999;
myDiv.dataset.name = "bob";
//修改後的非標準屬性值
console.log(myDiv);
</script>
</body>
</html>
效果:
插入標記
innerHTML
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
</style>
</head>
<body>
<div id="myDiv" data-app="123" data-name="tom">
<p>innerHTML</p>
<ul>
<li>PHP</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
</div>
<script>
var myDiv = document.querySelector("#myDiv");
console.log(myDiv.innerHTML);
</script>
</body>
</html>
效果:
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
</style>
</head>
<body>
<div id="myDiv" data-app="123" data-name="tom">
<p>innerHTML</p>
<ul>
<li>PHP</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
</div>
<script>
var myDiv = document.querySelector("#myDiv");
//輸入模式下,創建新的DOM來替換原所有子節點
myDiv.innerHTML = "<p>這是替換的文字</p>";
console.log(myDiv.innerHTML);
</script>
</body>
</html>
效果:
outerHTML
在讀取模式下,該屬性返回 調用它的對象及以下所有子節點的內容(元素、註釋、文本節點,包括HTML標籤)的<html>標籤,在寫入模式下,outerHTML根據寫入的值創建一個新的DOM節點,用於完全替換調用對象。
讀取模式:
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
</style>
</head>
<body>
<div id="myDiv" data-app="123" data-name="tom">
<p>innerHTML</p>
<ul>
<li>PHP</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
</div>
<script>
var myDiv = document.querySelector("#myDiv");
//返回調用對象及以下所有子節點的內容(元素、註釋和文本節點,包括<html>標籤)的<html>標籤。
console.log(myDiv.outerHTML);
</script>
</body>
</html>
效果:
outerHTML返回的包括了調用對象的<html>標籤。
寫入模式:
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
</style>
</head>
<body>
<div id="myDiv" data-app="123" data-name="tom">
<p>innerHTML</p>
<ul>
<li>PHP</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
</div>
<script>
var myDiv = document.querySelector("#myDiv");
myDiv.outerHTML = "<p>替換文本</p>";
console.log(document.body);
</script>
</body>
</html>
<p>元素將<div>元素完全替換掉了。也就是說,頁面中沒有了<div>元素及以下的子節點,只有<p>元素了。
在使用innerHTML和outerHTML屬性時需要注意:在刪除或替換帶有事件處理程序的DOM結構中的子樹對象時(元素),由於事件觸發,該元素與事件處理程序已經綁定並存在於內存中了,當使用這兩個方法來替換或刪除這個元素(DOM結構中的子樹對象)時,只是刪除或替換了這個元素,但元素與事件處理程序的綁定關係還在內存中,並沒有刪除,所以這樣就白白浪費內存了,當所替換的元素越來越多時,佔用的內存也就越多。這樣就影響了性能,解決方法:最好手工刪除要被替換或刪除的元素的所有事處理程序和JavaScript對象屬性。
insertAdjacentHTML()
該方法接收兩個參數:插入的位置和要插入的HTML文本。
- beforebegin:在當前節點之前插入一個緊臨的同輩節點
- beforeend:在當前節點之下插入一個新的節點或在最後一個子節點之後插入新的節點
- afterbegin:在當前節點之後插入一個緊臨的同輩節點
- afterend:在當前節點之下插入一個新的節點或在第一個子節點之前插入新的節點
<!doctype html>
<html lang="zh-en">
<head>
<meta charset="utf-8">
<title>JavaScript</title>
<style>
</style>
</head>
<body>
<div id="myDiv" data-app="123" data-name="tom">
<p>innerHTML</p>
<ul>
<li>PHP</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
</div>
<script>
var myDiv = document.querySelector("#myDiv");
//在指定節點前插入新節點
myDiv.insertAdjacentHTML("beforebegin", "<p>前面插入的文本</p>");
//在指定節點後面插入新節點
myDiv.insertAdjacentHTML("afterend", "<p>後面插入的文本</p>");
//在指定節點之下插入新節點
myDiv.insertAdjacentHTML("afterbegin", "<p>下面插入的文本1</p>");
myDiv.insertAdjacentHTML("beforeend", "<p>下面插入的文本2</p>");
console.log(document.body);
</script>
</body>
</html>
效果: