在javascript中使用getElementsByClassName和getElementById进行链接

时间:2011-11-22 03:15:15

标签: javascript getelementbyid

以下javascript代码抛出错误

Uncaught TypeError: Object #<HTMLSpanElement> has no method 'getElementById'

如果不允许这样做,我如何在其他元素中搜索特定元素的存在?

var googlePlusPosts = document.getElementsByClassName("mo fj");

for (var i = 0; i <  googlePlusPosts .length; ++i) {
        decryptElements = googlePlusPosts[i].getElementById('decrypt-button');
.
.
.

4 个答案:

答案 0 :(得分:3)

getElementById不是Element接口的一部分,它是Document接口的一部分。 http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-getElBId

因此,只能通过调用document.getElementById来获取ID的元素。这在规范中是完全正确的,因为在文档中只能有一个元素和指定的ID,所以我实际上感觉到问题出现在你的代码中(看起来你已经超过了一个id为“decrypt-button”的元素。)

至于链接,如果你可以确保你在浏览器中有querySelector接口,你可以googlePlusPosts[i].querySelector('#decrypt-button');这仍然是错误的,因为你应该使用一个类而不是一个id并且{{1} }}

答案 1 :(得分:0)

ID必须是唯一的;因此,在特定节点内查找特定ID并没有多大意义; ID存在,或者不存在。

您可以使用element.getElementsByClassName来获取特定类的子元素,或使用element.getElementsByTagName来获取它们的标记名称。

编辑:忽略以下内容;刚为后人保存。

检查元素是否具有提前的getElementById方法。

if (foo.getElementById) {
  foo.getElementById("bar");
}

答案 2 :(得分:0)

modern browsers中,您可以使用querySelector

googlePlusPosts[i].querySelector("#decrypt-button")

否则,您最好使用框架。

答案 3 :(得分:0)

假设您想要覆盖未实现.querySelector()的旧浏览器,并且您没有使用已经具有内置方法的某些框架/库,那么可以检查特定元素是否包含另一个element是编写自己的使用.parentNode的函数,如下所示:

function isDescendant(p, c) {
   while (null != (c = c.parentNode))
      if (p === c)
         return true;

   return false;
}

// then, from your code:

var decryptButton =document.getElementById("decrypt-button");
for (var i = 0; i <  googlePlusPosts .length; ++i)
   if (isDescendant(googlePlusPosts[i], decryptButton))
      // do something