我想写一个书签在两个不同的页面上工作。我可以成功迭代并处理元素,但为了容纳这两个不同的页面,我想用两个不同的类名称编译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