節點類型
nodeType
以下是一些重要的nodeType的取值:
1: 元素element
2: 屬性attr
3: 文字text
8: 註comments
9: 文檔document
nodeName,nodeValue
節點關係
childNodes: 每個節點都有一個childNodes屬性,其中保存著一個NodeList物件
firstChild: 等同於childNodes[0]
lastChild: 等同於childNodes.length-1
同時透過使用清單中每個節點的previousSibling和nextSibling屬性,可以存取同一清單中的其他節點。
操作節點
appendChild()
appendChild()方法用於在childNodes清單的末尾新增一個節點。新增節點後,childNodes的新增節點、父節點及先前的最後一個子節點的關係指標都會隨之更新。
insertBefore()
insertBefore()這個方法接受兩個參數:要插入的節點和作為參照的節點。
1 2 3 4 5 6 7 8 | returnedNode = someNode.insertBefore(newNode,null);
returnedNode = someNode.insertBefore(newNode,someNode.firstChild);
returnedNode = someNode.insertBefore(newNode,someNode.lastChild);
|
登入後複製
repaceChild()
repaceChild()接受兩個參數,要插入的節點和要替換的節點
1 | var returnedNode = someNode.replaceChild(newNode,someNode.firstChild);
|
登入後複製
removeChild()
只移除而非替換節點。
1 | var formerFirstChild = someNode.removeChild(someNode.firstChild);
|
登入後複製
cloneNode()
item 1
item 2
item 3
1 2 3 4 5 | var deepList = myList.cloneNode(true);
console.log(deepList.length);
var shallowList = myList.cloneNode(false);
console.log(shallowList.childNodes.length);
|
登入後複製
Document類型
Document節點具有下列特徵:
- nodeType的值為9;
- nodeName的值為#document;
- nodeValue的值為null;
- parentNode的值為null;
- ownerDocument的值為null;
文檔的子節點
1 2 3 | var html = document.documentElement;
console.log(html === document.childNodes[0]);
console.log(html === document.firstChild);
|
登入後複製
文件資訊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var originalTitle = document.title;
document.title = "New page title" ;
var url = document.URL;
var domain = document.domain;
var referrer = document.referrer;
document.domain = "wrox.com" ;
document.domain = "nczonline.net" ;
|
登入後複製
在IE7中呼叫document.getElementById("myElement");結果會回傳元素,如下所示;
最好的方法是不讓表單欄位的name特性與其他元素的ID相同。
1 2 | <input type= "text" name= "myElement" value= "text field" >
<div id= "myElement" >a div</div>
|
登入後複製
特殊集合
- document.anchors,包含文件中所有帶有name特性的a元素;
- document.forms, 包含文件中所有form元素,與document.getElementsByTagName("form")所得到的結果相同;
- document.images,包含文件中所有的img元素,與document.getElementsByTagName("img")得到的結果相同;
- document.links,包含文件中所有帶有href特性的a元素;
文件寫入
1 2 3 4 5 6 7 8 9 10 | <html>
<head>
<title>document.write() Example 3</title>
</head>
<body>
<script type= "text/javascript" >
document.write( "<script type=\"text/javascript\" src=\"file.js\">" ) + "<\/script>" );
</script>
</body>
</html>
|
登入後複製
字串不會被當作外部script標籤的關閉標籤,因而頁面中也就不會出現多餘的內容了。
Element類型
Element節點具有以下特性:
- nodeType的值為1;
- nodeName的值為元素的標籤名稱;
- nodeValue的值為null;
- parentNode可能是Document或Element;
要存取元素的標籤名,可以使用nodeName屬性,也可以使用tagName屬性;
1 2 3 4 5 6 7 8 9 10 11 | <div id= "myDiv" ></div>
var div = document.getElementById( "myDiv" );
console.log(div.tagName);
console.log(div.nodeName);
if (element.tagName== "div" ) {
}
if (element.tagName.toLowerCase == "div" ) {
}
|
登入後複製
取得特性
操作特性的DOM方法主要有三個,分別是getAttribute()、setAttribute()、removeAttribute();
請注意,傳遞給getAttribute()的特性名與實際的特性名相同。印像要得到class的特性值,應該傳入"class"而不是"className"。
1 2 | var div = document.getElementById( "myDiv" );
console.log(div.getAttribute( "class" ));
|
登入後複製
建立元素
使用document.createElement()方法可以建立新元素。
元素的子節點
執行某項操作以前,通常都要先檢查一下nodeType屬性,如下面的範例所示:
1 2 3 4 5 | for ( var i=0; len = element.childNodes.length; i<len; i++){
if (element.childNodes[i].nodeType ==1) {
}
}
|
登入後複製
Text类型
Text节点具有以下特征:
- nodeType的值为3;
- nodeName的值为"#text";
- nodeValue的值为节点所包含的文本;
- parentNode是一个Element;
创建文本节点
可以使用document.createTextNode()创建新文本节点。
规范化文本节点
normalize()
分割文本节点
splitText()
Comment类型
comment节点具有下列特征:
- nodeType的值为8;
- nodeName的值为"#comment";
- nodeValue的值是注释的内容;
- parentNode可能是Document或Element;
- 不支持(没有)子几点;
DOM操作技术
操作表格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | var table = document.createElement( "table" );
table.border = 1;
table.width = "100%" ;
var tbody = document.createElement( "tbody" );
table.appendChild(tbody);
tbody.insertRow(0);
tbody.rows[0].insertCell(0);
tbody.rows[0].cells[0].appendChild(document.createTextNode( "cell 1,1" ));
tbody.rows[0].insertCell(1);
tbody.rows[0].cells[1].appendChild(document.createTextNode( "cell 2,1" ));
tbody.insertRow(01);
tbody.rows[1].insertCell(0);
tbody.rows[1].cells[0].appendChild(document.createTextNode( "cell 1,2" ));
tbody.rows[1].insertCell(1);
tbody.rows[1].cells[1].appendChild(document.createTextNode( "cell 2,2" ));
document.body.appendChild(table);
|
登入後複製
选择符API
querySelector()方法
1 2 3 4 5 6 7 8 9 10 11 | var tbody = document.querySelector( 'body' );
var myDIV = document.querySelector( "#myDiv" );
var selected = document.querySelector( ".selected" );
var img = document.body.querySelector( "img.button" );
|
登入後複製
querySelectorAll()方法
1 2 3 4 5 6 7 8 | var ems = document.getElementById( "myDiv" ).querySelectorAll( "em" );
var selecteds = document.querySelectorAll( ".selected" );
var strongs = document.querySelectorAll( "p strong" );
|
登入後複製
HTML5
与类相关的扩充
getElementsByClassName()方法:
该方法可以通过document对象及所有HTML元素调用该方法。
1 2 3 4 5 | var allCurrentUsernames = document.getElementsByClassName( "username current" );
var selected = document.getElementById( "myDiv" ).getElementsByClassName( "selected" );
|
登入後複製
焦点管理
HTML5也添加了辅助管理DOM焦点的功能。首先就是document.activeElement属性,这个属性始终会引用DOM中当前获得了焦点的元素。
1 2 3 | var button = document.getElementById( "myButton" );
button.focus();
alert(document.activeElement === button);
|
登入後複製
默认情况下,文档刚刚加载完成时,document.activeElement中保存的是document.body元素的引用。文档加载期间,docuemnt.activeElement的值为null。
另外就是新增了document.hasFocus()方法,这个方法用于确定文档是否获得了焦点。
1 2 3 | var button = document.getElementById( "myButton" );
botton.focus();
alert(document.hasFocus());
|
登入後複製