2011-06-16 88 views
2

我有这样的代码片段:如何连接两个getElementsBy

var profileLinks = new Array(); 

for (var i = 0; i<searchResult.length; ++i) 
{ 
    var profileLink=searchResult[i].getElementsByTagName("a"); 
    profileLinks[i]=profileLink[0].href; 
    alert(i+1+" of "+searchResult.length+" "+profileLinks[i]); 
} 

好像我应该能够使其更加简洁使用这样的:

//alternate construction (why doesn't this work?) 

var searchResult = document.getElementsByClassName("f_foto").getElementsByTagName("a"); 

什么是错在这里?

回答

1
document.getElementsByClassName("f_foto") 

返回一个选择,因此您不能链接功能。你需要直接指定一个元素而不是整个选择,例如这可以正常工作。

document.getElementsByClassName("f_foto")[0].getElementsByTagName("a"); 

因为document.getElementsByClassName( “f_foto”)[0]指向对象,而不是选择对象。

+0

非常感谢。所以如果我只是迭代通过实例,document.getElementsByClassName(“f_foto”)[0] .getElementsByTagName(“a”);用[i]代替[0]我应该得到我想要的 – Jerome 2011-06-16 17:48:09

+0

迭代通过 document.getElementsByClassName(“f_foto”)[x]并检查.getElementsByTagName(“a”) 将返回元素中的所有锚元素用className =“f_foto”。如果这就是你所要做的,那么它会起作用。虽然正如其他提到的IE8和低于兼容性。 – Pantelis 2011-06-16 17:56:02

0

您可以在节点上调用getElementsByTagName,而不是通过getElementsByClassName返回的数组。

0

我相信getElementsByTagName只能应用于元素节点,但getElementsByClassName结果肯定将是节点的列表。您必须选择一个([0]?)或迭代集合(确保它不是空的!)。

1

这就是为什么我们有图书馆甚至是现代浏览器。您正在寻找的jQuery的CSS选择$('.f_foto a'),或Prototoype /铬

2

使用querySelectorAll()代替$$('.f_foto a')

var searchResult = document.querySelectorAll(".f_foto a"); 

IE 8支持querySelectorAll()但不getElementsByClassName(),所以这应该给你更好的兼容性了。

为了完全兼容,请坚持使用原来的代码或使用类似jQuery的库。