编辑:我的解决方案,基于所选答案:
var $brs,
$chunks = [];
$brs = $('hr:eq(1)').nextUntil($('hr:eq(2)')).filter('br');
$chunks.push($('hr:eq(1)').nextUntil($brs.eq(0)));
for (i = 0; i < $brs.length - 1; i++) {
$chunks.push($brs.eq(i).nextUntil($brs.eq(i+1)));
}
我有一个不寻常的案例,这是由于我试图用javascript解析的非常糟糕的网站。我不会深入研究有趣的解析,但我终于设法将其分解为一个有意义的结构。我现在有一个看起来像这样的DOM(出于所有意图和目的,将其视为标签的平面列表,每个标签在下一次启动之前关闭):
<hr>
<a>
<span class="desc">
[<a>*] // 0 or more anchor tags can show up here
<br>
<br>
<a>
<span class="desc">
[<a>*]
<br>
<br>
.
.
.
我想要做的是将每个标签集群抓取到它自己的数组/ jquery对象中,基本上是在&lt; br&gt;上运行.split()。标签。有可能做这样的事吗?如果没有,你会怎么把它分成块呢?结果就是这样:
[<a>, <span class="desc">, <a>],
[<a>, <span class="desc">],
[<a>, <span class="desc">, <a>, <a>, <a>],
[<a>, <span class="desc">],
...
答案 0 :(得分:1)
我不确定你为什么要这样做,而不仅仅是修改html,但在技术上可以使用.nextUntil
jQuery方法。
从hr
开始,选择所有兄弟元素直到第一个br
并将jQuery集推送到数组中。在每对换行符之间重复此过程。 .eq()
可用于定位特定的br
。
var $brList = $("br");
var domArray = [];
for(var i=0; i < $brList.length; i++){
if(i==0){
domArray.push($("hr").nextUntil($brList.eq(i)));
continue;
}
domArray.push($brList.eq(i-1).nextUntil($brList.eq(i)));
}
当然,指定的选择器会在页面上找到所有br
或hr
元素,因此如果有其他元素,您需要使选择器更具体。您可以通过为选择器提供上下文来实现此目的。
.toArray()
方法将为您处理:
domArray.push(
$brList.eq(i-1)
.nextUntil($brList.eq(i))
.toArray()
);