ChildNode如何工作

时间:2013-11-08 15:30:03

标签: javascript nodes getelementbyid

<html>
  <head>

    <title></title>
    <script type="text/javascript"><!--
function test2() {
  var val2 = document.getElementById("ex2").childNodes[1].childNodes[0].nodeValue;
  alert(val2);
}
--></script>

  </head>
  <body>
        <div id="ex2">Web courses - <span>http://coursesweb.net</span> - lessons, tutorials</div>
<a href="#" onclick="test2()" title="childNodes example">Test 2</a>
  </body>
</html>

以上警告http://coursesweb.net

但是,如果我添加<p>Some text</p>而不是我尝试添加childNodes[2]则无效。

有人可以解释一下这段代码和ChildNode概念。

3 个答案:

答案 0 :(得分:3)

跟踪我们发现的原始查询document.getElementById("ex2").childNodes[1].childNodes[0].nodeValue;

document.getElementById("ex2") =&gt; <div id="ex2">Web courses -<span>http://coursesweb.net</span> - lessons, tutorials</div>

因为textNode“Web课程”是第一个节点

.childNodes[1] =&gt; <span>http://coursesweb.net</span>

.childNodes[0] =&gt; textNode "http://coursesweb.net"

.nodeValue =&gt; "http://coursesweb.net"

如果您想添加<p>Some text</p>制作原始的ex2字符串:

<div id="ex2">Web courses - <span>http://coursesweb.net</span><p>Some text</p> - lessons, tutorials</div>

现在 document.getElementById("ex2").childNodes[2].childNodes[0].nodeValue; =&gt; "Some text"

答案 1 :(得分:1)

childNodes属性返回节点子节点的集合,作为NodeList。

提示:您可以使用length属性来确定子节点的数量,然后您可以遍历所有子节点并提取所需的信息。

在此JavaScript中返回“http://coursesweb.net”,因为id为ex2的div具有子节点,我们得到它的值。

答案 2 :(得分:1)

注意childNodes,无论您使用的是IE 8(或更低版本)以及其他浏览器,其内容都会有所不同:

  

Firefox和大多数其他浏览器会将空白空格或新行视为文本节点,Internet Explorer不会

http://quirksmode.org/dom/core/#t70

这意味着如果您只是在两个节点之间添加空格或新行,在某些浏览器上,两个节点将在childNodes中彼此相邻,或者将由空节点分隔。

在FireFox中:

<div>hey</div> <p>Some text</p> // childNodes[0] : hey, childNodes[1] : some text

的结果不同
<div>hey</div>
<p>Some text</p> // childNodes[0] : hey, childNodes[1] : nothing, childNodes[2] : some text

在Internet Explorer中,两者都是相同的(childNodes [0]:嘿,childNodes [1]:some text)

如果可以的话,你宁可使用jQuery .find()直接挖掘给定的显式标识符。

但是如果你需要内省现有的DOM树,你需要处理这个烦人的事实。见best way to get child nodes