--- title: Node slug: Web/API/Node tags: - API - DOM - Interface - Node - Reference - 参考 translation_of: Web/API/Node ---
{{APIRef("DOM")}}
Node
是一个接口,各种类型的 DOM API 对象会从这个接口继承。它允许我们使用相似的方式对待这些不同类型的对象;比如, 继承同一组方法,或者用同样的方式测试。
以下接口都从 Node
继承其方法和属性:
在方法和属性不相关的特定情况下,这些接口可能返回 null
。它们可能会抛出异常 - 例如,当将子节点添加到不允许子节点存在的节点时。
{{InheritanceDiagram}}
从其父类型 {{DOMxRef("EventTarget")}}[1] 继承属性。
null
。null
。null
。'audio'
,{{DOMxRef("Text")}}节点对应的是 '#text'
还有{{DOMxRef("Document")}}节点对应的是 '#document'
。无符号短整型
的值,可能的值如下:
Name | Value |
---|---|
ELEMENT_NODE |
1 |
ATTRIBUTE_NODE {{Deprecated_Inline}} |
2 |
TEXT_NODE |
3 |
CDATA_SECTION_NODE |
4 |
ENTITY_REFERENCE_NODE {{Deprecated_Inline}} |
5 |
ENTITY_NODE {{Deprecated_Inline}} |
6 |
PROCESSING_INSTRUCTION_NODE |
7 |
COMMENT_NODE |
8 |
DOCUMENT_NODE |
9 |
DOCUMENT_TYPE_NODE |
10 |
DOCUMENT_FRAGMENT_NODE |
11 |
NOTATION_NODE {{Deprecated_Inline}} |
12 |
Note: 在Firefox 3.5以及更早的版本中, HTML 元素的 localName 属性的返回值都是大写的(XHTML 例外)。在后续版本中,这种情况就不存在了。无论是 HTML 还是 XHTML 中,均返回小写的 localName。
URL
,如果没有命名空间则为null
。
Note: 在Firefox 3.5以及更早的版本中, HTML 的元素都没有命名空间. 而在最新的版本中, 无论是 HTML 还是 XML 文档树 ,所有元素的命名空间统一为 http://www.w3.org/1999/xhtml/
。
null
。从其父类型 {{DOMxRef("EventTarget")}}[1] 继承方法。
function removeAllChildren(element){ while(element.firstChild){ element.removeChild(element.firstChild); } }
/* ... an alternative to document.body.innerHTML = "" ... */ removeAllChildren(document.body);
下面这个函数使用递归的方式遍历一个节点的所有子节点(包括这个根节点自身)。
function eachNode(rootNode, callback){ if(!callback){ var nodes = []; eachNode(rootNode, function(node){ nodes.push(node); }); return nodes; } if(false === callback(rootNode)) return false; if(rootNode.hasChildNodes()){ var nodes = rootNode.childNodes; for(var i = 0, l = nodes.length; i < l; ++i) if(false === eachNode(nodes[i], callback)) return; } }
eachNode(rootNode, callback);
使用递归的方式对 rootNode
的所有后代节点执行回调函数(包括 rootNode
自身)
如果没有设定 callback
,这函数会返回一个{{jsxref("Array")}},包含 rootNode
和它的所有后代节点。
如果设定了 callback
(回调函数),如果回调函数在调用中返回 {{jsxref("Boolean")}} false
,则当前层级的遍历会中止,同时恢复上一层级的遍历。这个可以用来在找到需要的节点之后中断循环(比如用来查找包含指定文本的文本节点)
rootNode
Node
对象。callback
eachNode
返回一个包含了 rootNode
所有后代节点以及 rootNode
自身的{{jsxref("Array")}}下述例子会打印出ID为 "box"
的 <div>
标签内的所有 <span>
标签的 textContent
属性:
<div id="box"> <span>Foo</span> <span>Bar</span> <span>Baz</span> </div>
var box = document.getElementById("box"); eachNode(box, function(node){ if(null != node.textContent){ console.log(node.textContent); } });
用户终端上会显示如下字符:
"\n\t", "Foo", "\n\t", "Bar", "\n\t", "Baz"
Note: 空格是构成 {{DOMxRef("Text")}}节点的一部分,意味着缩进和换行在 Element
节点之间形成单独的 Text
。
下述例子反应了 eachNode
函数是如何在真实场景中使用的:搜索网页中的文本。我们使用一个包装函数 grep
去执行搜索:
function grep(parentNode, pattern){ var matches = []; var endScan = false; eachNode(parentNode, function(node){ if(endScan) return false; // Ignore anything which isn't a text node if(node.nodeType !== Node.TEXT_NODE) return; if("string" === typeof pattern){ if(-1 !== node.textContent.indexOf(pattern)) matches.push(node); } else if(pattern.test(node.textContent)){ if(!pattern.global){ endScan = true; matches = node; } else matches.push(node); } }); return matches; }
例如:找到所有包含错别字的 {{DOMxRef("Text")}}:
var typos = ["teh", "adn", "btu", "adress", "youre", "msitakes"]; var pattern = new RegExp("\\b(" + typos.join("|") + ")\\b", "gi"); var mistakes = grep(document.body, pattern); console.log(mistakes);
规范 | 状态 | 备注 |
---|---|---|
{{SpecName("DOM WHATWG", "#interface-node", "Node")}} | {{Spec2("DOM WHATWG")}} | 增加了以下方法: getRootNode() |
{{SpecName("DOM4", "#interface-node", "Node")}} | {{Spec2("DOM4")}} | 移除了以下属性: attributes , namespaceURI , prefix , 和 localName .移除了以下方法: isSupported() , hasAttributes() , getFeature() , setUserData() , and getUserData() . |
{{SpecName("DOM3 Core", "core.html#ID-1950641247", "Node")}} | {{Spec2("DOM3 Core")}} | insertBefore() , replaceChild() , removeChild() , 和 appendChild() 方法在{{DOMxRef("Document")}} 上调用时遇到特定错误时会抛出一个新的异常(NOT_SUPPORTED_ERR )。normalize() 方法已被修改,使得当设定特定的 {{DOMxRef("DOMConfiguration")}} 属性时, {{DOMxRef("Text")}} 节点也能被正确整理。添加以下方法: compareDocumentPosition() , isSameNode() , lookupPrefix() , isDefaultNamespace() , lookupNamespaceURI() , isEqualNode() , getFeature() , setUserData() , and getUserData(). 添加以下属性: baseURI 和 textContent . |
{{SpecName("DOM2 Core", "core.html#ID-1950641247", "Node")}} | {{Spec2("DOM2 Core")}} | 修改 ownerDocument 属性,当访问 {{DOMxRef("DocumentFragment")}} 子节点的 ownerDocument 属性也会返回 null。添加下列属性: namespaceURI , prefix , 和 localName .添加下列方法: normalize() , isSupported() 和 hasAttributes() . |
{{SpecName("DOM1", "level-one-core.html#ID-1950641247", "Node")}} | {{Spec2("DOM1")}} | Initial definition. |
{{Compat("api.Node")}}