2010-10-10 24 views
3

在这个简单的脚本中,我收到错误“obj.parentNode.getElementById不是函数”,我不知道,什么是错的。getElementById无法在节点上工作

<script type="text/javascript"> 

     function dosomething (obj) { 
     sibling=obj.parentNode.getElementById("2"); 
     alert(sibling.getAttribute("attr")); 
     } 

</script> 

<body> 
<div> 
    <a id="1" onclick="dosomething(this)">1</a> 
    <a id="2" attr="some attribute">2</a> 
</div> 
</body> 

回答

5

.getElementById()document,像这样:

document.getElementById("2"); 

由于ID被应该是独特,没有必要为一种方法,其通过相对ID查找元素的任何其它元件(在这种情况下,在该父母的内部)。此外,如果使用HTML4,则不应以数字开头,编号为的数字为在HTML5中有效。

+0

因此,尽管getElementById经常与其他DOM方法一起描述为适用于任何节点,但实际上它仅适用于文档。好,谢谢。 – 2010-10-10 23:54:27

1

document.getElementById()将不起作用,如果该节点是动态创建的,但尚未附加到主文档dom中。

例如在Ajax中,并非所有节点都连接在任何给定点上。在这种情况下,你要么需要一个手柄明确追踪到每一个节点(通常为最佳性能),或使用类似这样找对象备份:

function domGet(id , rootNode) { 
    if (!id) return null; 

    if (rootNode === undefined) { 

     // rel to doc base 
     var o = document.getElementById(id); 
     return o; 

    } else { 

     // rel to current node 
     var nodes = []; 
     nodes.push(rootNode); 
     while (nodes && nodes.length > 0) { 
      var children = []; 
      for (var i = 0; i<nodes.length; i++) { 
       var node = nodes[i]; 
       if (node && node['id'] !== undefined) { 
        if (node.id == id) { 
         return node; // found! 
        } 
       } 

       // else keep searching 
       var childNodes = node.childNodes; 
       if (childNodes && childNodes.length > 0) { 
        for (var j = 0 ; j < childNodes.length; j++) { 
         children.push(childNodes[j]); 
        } 
       } 
      } 
      nodes = children; 
     } 

     // nothing found 
     return null; 
    } 
} 
2

更换.getElementById(ID)与.querySelector( '#' + ID);