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 で解析しようとしている非常に貧弱に書かれた Web サイトに起因する異常なケースを持っています。楽しい構文解析については詳しく説明しませんが、最終的に意味のある構造に分解することができました。これで、次のような 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>
.
.
.

私がやろうとしているのは、本質的に <br> タグで .split() を実行することにより、タグの各クラスターを独自の配列/jquery オブジェクト/何でも取得することです。そのようなことは可能ですか?そうでない場合、これをどのようにチャンクに分割しますか? したがって、結果は次のようになります。

[<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)));
}

もちろん、指定されたセレクターはページ上のすべてbrまたはhr要素を見つけるので、他のセレクターがある場合はセレクターをより具体的にする必要があります。これを行うには、セレクターが参照するコンテキストを提供します。


jQuery オブジェクト全体を配列に保持したくない場合 (ただし、通常の配列メソッドを使用して DOM 要素を取得できるため、保持したい場合がありますが、すべての jQuery 機能を利用できるという追加の利点があります)、次のことができます。 jQuery オブジェクトを通常の配列に変換します。jQuery の.toArray()メソッドがそれを処理します。

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