Node对象是DOM Core中的核心对象,其中Element、document和documentElement都继承自Node对象。
nodeName、nodeValue和nodeType
对于Element对象nodeName属性会取得大写形式的标签名称:
ADS.addEvent(window, 'load', function() {
ADS.log.header('testNodeName');
ADS.log.write('nodeName is: ' + document.getElementById('firefox').nodeName);
});
因为sample.html中带有id=”firefox”属性的节点是一个锚节点,所在在日志窗口将会得到如下的输出:
nodeName is: A
nodeName的值取决于引用对象的类型。下表列出了不同的节点类型(nodeType)相应的nodeName返回值:
| 对象 | 返回值 |
| Element.nodeName | 元素的名称,大写 |
| Attr.nodeName | 属性的名称,大写 |
| Text.nodeName | #text |
| CDATASection.nodeName | #cdata-section |
| EntityReference.nodeName | 实体引用的名称 |
| Entity.nodeName | 实体的名称 |
| ProcessingInstruction.nodeName | 目标的名称 |
| Comment.nodeName | #comment |
| Document.nodeName | #document |
| DocumentType.nodeName | 文档类型的名称,如HTML |
| DocumentFragment.nodeName | #document fragment |
| Notation.nodeName | 表示法的名称 |
nodeValue属性会返回Attr、ProcessingInstructions、Comments、Text和CDATASection对象的值,其它所有对象的nodeValue属性都返回null。例如:
ADS.addEvent(window,'load',function () {
ADS.log.header('The node value of the anchor');
ADS.log.write('nodeValue is: '+ document.getElementById('firefox').nodeValue);
});
因为锚属于Element对象,所以它的nodeValue会返回:
nodeValue is: null
与nodeName类似,nodeValue属性对于不同的对象类型具有不同的含义,下表列出了每种核心对象类型的nodeValue属性的返回值:
| 对象 | 返回值 |
| Element.nodeName | null |
| Attr.nodeName | 字符串形式的属性值 |
| Text.nodeName | 字符串形式的节点内容 |
| CDATASection.nodeName | 字符串形式的节点内容 |
| EntityReference.nodeName | null |
| Entity.nodeName | null |
| ProcessingInstruction.nodeName | 字符串形式的节点内容 |
| Comment.nodeName | 字符串形式的注释文本 |
| Document.nodeName | null |
| DocumentType.nodeName | null |
| DocumentFragment.nodeName | null |
| Notation.nodeName | null |
nodeType包含某个命名常量对应的一个整数值。下表列出了整数值对应的命名常量:
| nodeType值 | 等价命名常量 |
| 1 | Node.ELEMENT_NODE |
| 2 | Node.ATTRIBUTE_NODE |
| 3 | Node.TEXT_NODE |
| 4 | Node.CDATA_SECTION_NODE |
| 5 | Node.ENTITY_REFERENCE_NODE |
| 6 | Node.ENTITY_NODE |
| 7 | Node.PROCESSING_INSTRUCTION_NODE |
| 8 | Node.COMMENT_NODE |
| 9 | Node.DOCUMENT_NODE |
| 10 | Node.DOCUMENT_TYPE_NODE |
| 11 | Node.DOCUMENT_FRAGMENT_NODE |
| 12 | Node.NOTATION_NODE |
例如:
ADS.addEvent(window,'load', function () {
ADS.log.header('Testing nodeType');
ADS.log.write('nodeType is: '+ document.getElementById('firefox').nodeType);
});
那么将返回:
nodeType is: 1
锚标签是HTMLAnchorElement的实例,而它又继承自Element对象,所以锚的nodeType的值为1。
如果在代码中检测nodeType,那么在比较关系中使用DOM常量即可:
if(node.nodeType == Node.COMMENT_NODE) {
// 针对注释节点的代码
}
而不是:
if(node.nodeType == 8) {
// 针对注释节点的代码
}
nodeType属性在老的IE浏览器中会有问题,因为IE不会报告它支持DOM2 Core,但却部分地支持该规范。要消除这种错误,可以定义自己的常量:
window['ADS']['node'] = {
ELEMENT_NODE : 1,
ATTRIBUTE_NODE : 2,
TEXT_NODE : 3,
CDATA_SECTION_NODE : 4,
ENTITY_REFERENCE_NODE : 5,
ENTITY_NODE : 6,
PROCESSING_INSTRUCTION_NODE : 7,
COMMENT_NODE : 8,
DOCUMENT_NODE : 9,
DOCUMENT_TYPE_NODE : 10,
DOCUMENT_FRAGMENT_NODE : 11,
NOTATION_NODE : 12
};
在添加上述代码之后,就可以在跨浏览器的脚本中使用相同的逻辑:
if(node.nodeType == ADS.node.COMMENT_NODE) {
// 在任何浏览器中针对注释节点的代码
}
使用命名常量有很多优点,既可以不用死记硬背数值与节点类型的对应关系,代码也更容易看懂、维护和调试。