0

编辑:我的解决方案,基于选择的答案:

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 对象/无论如何,基本上,在 <br> 标签上运行 .split() 。有可能做这样的事情吗?如果没有,您将如何将其分成块?所以结果是这样的:

[<a>, <span class="desc">, <a>],
[<a>, <span class="desc">],
[<a>, <span class="desc">, <a>, <a>, <a>],
[<a>, <span class="desc">],
...
4

1 回答 1

1

我不确定您为什么要这样做,而不是仅仅修改 html,但使用.nextUntiljQuery 方法在技术上是可行的。

从 开始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)));
}

当然,指定的选择器会找到页面上的所有brhr元素,因此如果有其他选择器,您需要使您的选择器更具体。你可以通过为选择器提供一个上下文来查看。


如果您不想将整个 jQuery 对象保留在数组中(尽管您可能确实希望这样做,因为您可以使用常规数组方法检索 DOM 元素——还有所有 jQuery 功能可用的额外好处),您可以将 jQuery 对象转换为常规数组。jQuery 的.toArray()方法会为你解决这个问题:

domArray.push(
    $brList.eq(i-1)
           .nextUntil($brList.eq(i))
           .toArray()
);
于 2012-07-18T03:58:10.583 回答