DOM類型
Node類型
<script type="text/javascript">
//IE不支持,我們可以模擬一個類,讓IE也支持。
if (typeof Node == 'undefined') {
window.Node = {
ELEMENT_NODE:1,
ATTRIBUTE_NODE:2,
TEXT_NODE:3,
COMMENT_NODE:8,
DOCUMENT_NODE:9,
DOCUMENT_TYPE_NODE:10
};
}
console.log(Node.ELEMENT_NODE);//1
console.log(Node.ATTRIBUTE_NODE);//2
console.log(Node.TEXT_NODE);//3
console.log(Node.COMMENT_NODE);//8
console.log(Node.DOCUMENT_NODE);//9
console.log(Node.DOCUMENT_TYPE_NODE);//10
</script>
Document類型
//元素
document.documentElement;//html
document.body;//body
document.doctype;//<!DOCTYPE>,ie8之前會返回null
//屬性
document.title;//獲取和設置<title>標籤的值
document.URL;//獲取URL路徑
document.domain;//獲取域名,服務器端
document.referrer;//獲取上一個URL,服務器端
//對象集合
document.anchors;//獲取文檔中帶name屬性的<a>元素集合
document.links;//獲取文檔中帶href屬性的<a>元素集合
document.applets;//獲取文檔中<applet>元素集合,已不用
document.forms;//獲取文檔中<form>元素集合
document.images;//獲取文檔中<img>元素集合
Text類型
<script type="text/javascript">
var box = document.createElement('div');
var text = document.createTextNode('Mr.');
var text2 = document.createTextNode('Lee!');
box.appendChild(text);
box.appendChild(text2);
document.body.appendChild(box);
console.log(box.childNodes.length);
//2,在同時創建兩個同一級別的文本節點的時候,會產生分離的兩個節點,其實是換行了
box.normalize();//合併成一個節點,其實是把換行去掉了
box.firstChild.splitText(3);//有合併就有分離,以三個字符爲距離進行換行
//除了上面的兩種方法外,Text還提供了一些別的DOM操作的方法如下:
box.firstChild.deleteData(0,2); //刪除從0位置的2個字符
box.firstChild.insertData(0,'Hello.');//從0位置添加指定字符
box.firstChild.replaceData(0,2,'Miss');//從0位置用Miss替換掉2個指定字符,如果第二個參數是0,則是添加Miss
box.firstChild.substringData(0,2);//從0位置獲取2個字符,直接輸出
console.log(box.firstChild.nodeValue);//Missllo..,輸出結果
</script>
Comment類型
<script type="text/javascript">
console.log(document.body.firstChild.nodeType);//8
console.log(document.body.firstChild.nodeValue);//this is comment
//在IE中,註釋節點可以使用!當作元素來訪問。
//var comment = document.getElementsByTagName('!');
</script>
DOM擴展
呈現模式
<script type="text/javascript">
if (document.compatMode == 'CSS1Compat') {
console.log(document.documentElement.clientWidth);
} else {
console.log(document.body.clientWidth);
}
</script>
滾動
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<a onClick="onc()" hef="#">click here</a>
<div style="height:400px; background-color:blue"></div>
<div id="nn" style="background-color: red;height:900px;"></div>
</body>
<script type="text/javascript">
//作爲一個事件的函數來被調用
function onc () {
var dd = document.getElementById("nn").scrollIntoView(true);//這個意思其實就是將這個元素滾動到瀏覽器窗口的頂部來顯示
}
</script>
</html>
children屬性
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="div">
<span>hello1</span>
<span>hello2</span>
<span>hello3</span>
</div>
</body>
<script type="text/javascript">
console.log(document.getElementById("div").children.length);//3
console.log(document.getElementById("div").children[0].innerHTML);//hello1
</script>
</html>
contains()方法
<script type="text/javascript">
var div = document.getElementById("div")
console.log(div.contains(div.firstChild));//true
</script>
在Firefox的DOM3級實現中提供了一個替代的方法compareDocumentPosition()方法。這個方法確定兩個節點之間的關係。
<script type="text/javascript">
var div = document.getElementById("div")
console.log(div.compareDocumentPosition(div.firstChild));//20
</script>
DOM操作內容
innerText屬性
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="div">
<span>hello1</span>
<span>hello2</span>
<span>hello3</span>
</div>
</body>
<script type="text/javascript">
var div = document.getElementById("div")
console.log(div.innerText);//獲取文本內容(如有html直接過濾掉)
div.innerText = 'Mr.Lee';//設置文本(如有html轉義)
//DOM3新屬性
console.log(div.textContent)
div.innerText = '<html>';
</script>
</html>
innerHTML屬性
<script type="text/javascript">
document.getElementById('div').innerHTML;//獲取文本(不過濾HTML)
document.getElementById('div').innerHTML = '<b>123</b>';//可解析HTML
</script>
<script type="text/javascript">
document.getElementById("div").innerHTML = "<script>alert('Lee');</script"+">";//<script>元素不能被執行
</script>
outerText屬性
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="div">
<span>hello1</span>
<span>hello2</span>
<span>hello3</span>
</div>
</body>
<script type="text/javascript">
var div = document.getElementById("div")
console.log(div.outerText);//獲取文本內容(如有html直接過濾掉)
div.outerText = 'Mr.Lee';//設置文本(如有html轉義)
console.log(document.getElementById("div"));//null
</script>
</html>
outerHTML屬性
<script type="text/javascript">
var div = document.getElementById("div")
console.log(div.outerHTML);//獲取文本內容(如有html直接過濾掉)
div.outerHTML = '<b>124</b>';//設置文本(如有html轉義)
console.log(document.getElementById("div"));//null
</script>
關於最常用的innerHTML屬性和節點操作方法的比較,在插入大量HTML標記時使用innerHTML的效率明顯要高很多。因爲在設置innerHTML時,會創建一個HTML解析器。這個解析器是瀏覽器級別的(C++編寫),因此執行JavaScript會快的多。但,創建和銷燬HTML解析器也會帶來性能損失。最好控制在最合理的範圍內,如下:
for (var i = 0; i < 10; i ++) {
ul.innerHTML = '<li>item</li>';//避免頻繁
}
//改
for (var i = 0; i < 10; i ++) {
a = '<li>item</li>';//臨時保存
}
ul.innerHTML = a;