有HTML页面,内容如下。
MDN上的文档说childNodes returns a collection of child nodes of the given element
是一个NodeList。
因此,根据文档,NodeList的第一个子节点应为<h1>PyCon Video Archive</h1>
。
但是,在开发者工具(Chromium)中,它反过来说。
![在此输入图片说明] [2]
那么,为什么第一个节点不是
<h1>PyCon Video Archive</h1>
? 为什么将文本对象作为第一个元素?
我会在此感谢一些帮助。
修改
所以,我只是想到在Firebug(FF)中,同样的函数表现不同。
我的新问题: 使用.childNodes()是一种访问DOM元素的不可靠方式吗?
答案 0 :(得分:1)
因为在h1
元素之前有一个空白文本节点。据推测,在源代码中(如果您查看源代码),h1
开始标记要么缩进,要么移动到正文中的新行(或两者)以便于阅读。猜测一下,我想它就像下面这样:
<body>
<h1>PyCon Video Archive</h1>
<!-- ...other html... -->
如果您将其修改为:
<body><h1>PyCon Video Archive</h1><!-- ...other html... -->
然后第一个childNode确实是h1
元素。
值得注意的是,即使在元素标记之外,文本仍然是父元素的子节点。虽然使用选择器无法轻易定位。
答案 1 :(得分:1)
要获得第一个元素子元素,您可以使用...
document.body.firstElementChild;
......但是较老的brwosers不支持它。
具有更大支持的方法是children
集合......
document.body.children[0];
...它有很好的支持,但在旧浏览器方面仍有一些漏洞。
(只需双重检查,只要您不支持Firefox 3,只要您不在标记中包含HTML代码注释,使用.children
将是安全的。)
为确保您拥有最广泛的浏览器支持,请创建一个功能......
function firstElementChild( parent ) {
var el = parent.firstChild;
while( el && el.nodeType !== 1 )
el = el.nextSibling;
return el;
}
并像这样使用它......
var h1 = firstElementChild( document.body );