学习笔记:
1. DOM 属性
- nodeName - 节点的名称
- nodeValue - 节点的值
- nodeType - 节点的类型
- parentNode - 节点的父节点
- childNodes - 节点 的子节点,返回 NodeList 对象
- attributes - 节点的属性节点,getNamedItem() 返回属性节点
- firstChild:表示第一个子节点
- lastChild:表示最后一个子节点
- previousSibling:表示前一个兄弟节点
- nextSibling:表示后一个兄弟节点
- ownerDocument:表示节点所属的文档对象
- textContent:表示节点的文本内容
2. DOM方法
- getElementsByTagName(name) - 获取带有指定标签名称的所有元素,返回 NodeList 对象
- getElementById(id):通过元素的id属性获取元素节点
- appendChild(node) - 插入子节点
- removeChild(node) - 删除子节点
- replaceChild() :用于替换节点
- getAttribute(name):获取指定属性的属性值
- setAttribute(name, value):设置指定属性的属性值
- removeAttribute(name):移除指定属性
- cloneNode(deep):复制节点,deep参数表示是否深度复制
- createAttribute(name):创建一个属性节点
- createElement(tagName):创建一个元素节点。
- createTextNode(text):创建一个文本节点
- createComment(data):创建一个注释节点
- hasChildNodes():检查节点是否有子节点
- normalize():合并相邻的文本节点并删除空文本节点
- importNode(node, deep):导入节点到当前文档,deep参数表示是否深度导入,是否包括原节点的所有属性和子节点
getAttributeNode(name):
用于获取指定节点的属性节点- insertBefore(newNode, y):用于在指定的子节点之前插入节点(父节点发起)
- removeAttributeNode(node):通过使用 Node 对象作为参数,来删除属性节点
- replaceData(offset,length,string) 方法用于替换文本节点中的数据,offset - 在何处开始替换字符,offset 值以 0 开始;length - 要替换多少字符,string - 要插入的字符串
createCDATASection(string)
:用于创建一个包含 CDATA(不会被解析的文本数据)的节点- insertData(offset, string):将数据插入已有的文本节点中
为父节点添加新节点,parentNode.appendChild(newElement);
删除节点只能是父节点删除子节点,parentNode.removeChild();
替换节点也是由父节点来替换,parentNode.replaceChild(newParagraph, oldParagraph);
3. 节点nodeType
元素类型 | 节点类型 |
---|---|
元素 | 1 |
属性 | 2 |
文本 | 3 |
CDATA_Section | 4 |
ENTITY_REFERENCE | 5 |
ENTITY | 6 |
PROCESSING_INSTRUCTION | 7 |
注释 | 8 |
文档 | 9 |
DOCUMENT_TYPE | 10 |
DOCUMENT_FRAGMENT | 11 |
NOTATION | 12 |
注:此处是nodeType有12个值而已,并不是枚举,名称不作为key。
4. 处理空白和换行
在处理XML的时候各浏览器有两处不同, 一个是加载xml的方式不同,另一个就是处理空白和换行的方式不同。
示例:
<bookstore>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
</bookstore>
对于该xml文件,输出子节点的数量:
x=xmlDoc.documentElement.childNodes;
document.write("Number of child nodes: " + x.length);
IE输出4,firefox等输出9. 输出4的话,就是4个“<book>”,而输出9的话,那么看一下子节点都是什么 。
function loadXMLDoc(fname) {
var xmlhttp1 = new XMLHttpRequest();
xmlhttp1.open("GET", fname, false);
xmlhttp1.send();
return xmlhttp1.responseXML;
}
xmlDoc = loadXMLDoc("/example/xdom/books.xml");
x = xmlDoc.documentElement.childNodes;
document.write("子节点的数目:" + x.length);
document.write("<br >");
for (let i = 0; i < x.length; i++) {
let value = x[i].nodeValue;
document.write("子节点:" + x[i].nodeName + " | " + tran(value));
document.write("<br >");
}
function tran(textContent) {
if (!textContent || textContent.length == 0) { return "none" }
var a = '';
for (var i = 0; i < textContent.length; i++) {
var char = textContent.charAt(i);
var unicode = char.charCodeAt(0).toString(2);
console.log(a + '\\u' + unicode);
a = a + '\\u' + unicode;
}
return a;
}
打印结果:
其中,“\u1010”,就是换行符。 可以使用判断nodeType是否等于1来过滤换行等文本节点。