2011-06-16 92 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的庫。