我想寫一個書籤在兩個不同的頁面上工作。我可以成功迭代並處理元素,但爲了容納這兩個不同的頁面,我想用兩個不同的類名稱編譯DIV列表。我開始與此:如何在純Javascript中連接getElementsByClassName的結果?
traces=
[].concat.apply(document.getElementsByClassName('fullStacktrace'),
document.getElementsByClassName('msg'))
,但在第一頁上它的結果是:
> traces=[].concat.apply(document.getElementsByClassName('fullStacktrace'),
document.getElementsByClassName('msg'))
[HTMLCollection[2]]
> traces[0]
[div.fullStacktrace, div.fullStacktrace]
> traces[1]
undefined
> traces[0][0]
<div class="fullStacktrace" style="height: auto;">…</div>
而其他頁面
> traces=[].concat.apply(document.getElementsByClassName('fullStacktrace'),
document.getElementsByClassName('msg'))
[HTMLCollection[0], div#msg_2.msg.l1, ... div#msg_6460.msg.l1]
> traces[0]
[]
> traces[1]
<div class="msg l1" id="msg_2">…</div>
所以getElementsByClassName方法既適用於網頁上,但它看起來像concat.apply不會迭代它的第一個參數,但會迭代它的第二個參數?!
所以我嘗試使用CONCAT兩次,並用括號全力以赴:
traces=(
(
[].concat.apply(document.getElementsByClassName('fullStacktrace'))
)
.concat.apply(document.getElementsByClassName('msg'))
)
,但它會變得陌生:第一頁說:
Array[1]
> 0: HTMLCollection[0]
length: 0
> __proto__: HTMLCollection
length: 1
> __proto__: Array[0]
另:
Array[1]
> 0: HTMLCollection[283] // Lots of div#msg_3.msg.l1 sort of things in here
length: 1
>__proto__: Array[0]
得到它的完整divs。因爲這兩組元素只在一個或另一個頁面上,所以我可以在我的特定情況下使用一個條件,但上面的行爲對我來說是非常令人驚訝的,所以我想理解它。有任何想法嗎?
以供參考,這是Mac的Chrome版本56.0.2924.87(64位)
贊成票提供了'querySelectorAll'解決方案 – Pineda
我對querySelectorAll的投票也一樣,但我仍然不明白爲什麼完全括號表達式沒有導致[HTMLCollection [],HTMLCollection []],也不知道爲什麼第一個表達式,第二個HTMLCollection被迭代(在第一種情況下,不存在,在第二個所有的divs中被追加),而第一個HTMLCollection被簡單地注入。 –
@ android.weasel:'.concat()'只會將一個集合放到結果中,如果它是一個實際的Array,所以'HTMLCollection'被視爲其他值。在你的第一個例子中使用'.apply()'應該添加'.msg'元素,所以如果有'msg'元素,那麼'traces [1]'不應該是'undefined'。如果沒有'msg',那麼它將是'undefined',因爲沒有什麼要添加的。 – 2017-03-17 13:29:45