0

異なるクラスの一連の行があります。

<tr class="head">...
<tr class="group">...
<tr class="item">...
<tr class="item">...
<tr class="item">...
<tr class="group">...
<tr class="item">...
<tr class="item">...
<tr class="item">...
<tr class="group">...
<tr class="item">...
<tr class="item">...
<tr class="item">...

コンテキストがアイテムの1つにあると仮定すると、グループを越えずに、アイテムであるアイテムの前後のすべての行を選択するにはどうすればよいですか?

この例では、現在のアイテム行に関係なく、常に3つのアイテム行のコレクションになるはずです。

現在私はこれを持っています、そしてそれが機能している間、私はよりクリーンな方法があることを望んでいます。

var $itemRows = $targetRow.prevUntil('tr.group').add($targetRow.nextUntil('tr.group')).add($targetRow);

似たような.siblings('tr.item')ものですが、3つの隣接するアイテムではなく、9つのアイテムすべてを取得します。そして、これはすでにtbodyにあり、それらをネストすることは無効なhtmlであるため、これらをtbodiesに入れることはできません。

私はそれを改善しました

var $itemRows = $targetRow.prevAll('tr.group:first').nextUntil('tr.group');
4

1 に答える 1

2

行の1つ(グループではない)であると仮定するとthis、次のように実行できます。

多くのシナリオをテストした後、これは私がうまくいったことを発見したものです:

$(this).prevUntil('tr.group').andSelf().nextUntil('tr.group').andSelf()

問題は、グループの最初の項目をクリックすると、gdoronのような他の組み合わせが機能しなかったことです。

あなたはここでこの1つの作品を見ることができます:http://jsfiddle.net/jfriend00/mks74/


私は少しクリーンな方法があるに違いないと思ったので、私はそれに取り組み続けました、そしてこれは私が見つけたものです:

$(this).prevAll('tr.group:first').nextUntil('tr.group')

あなたはここでこの1つの作品を見ることができます:http://jsfiddle.net/jfriend00/HZVnX/


ここで役立つのは(jQueryが提供していないようです)、いくつかのセレクター基準を満たす前の兄弟を取得するjQueryメソッドです。私たちはこのように自分自身を作ることができます:

jQuery.fn.prior = function(selector) {
    return (this.pushStack(this.prevAll(selector).first()));
};

そして、この問題を解決するためのコードは、もう少し論理的に読むことができます。

$(this).prior('tr.group').nextUntil('tr.group')
于 2012-05-31T21:38:42.420 に答える