0

JQuery を使用して、同じクラスの一連の要素から次の要素を選択しようとしています。

HTMLの設定は次のとおりです。

<div class="sameClass selected">
  <p>Text in here</p>
</div>
<div class="differentClass">
  <p>Text in here
</div>
<div class="sameClass">
  <p>Text in here</p>
</div>

クラス「sameClass」を持つ最初の div がある場合、「選択された」クラスを一番上の div から削除し、クラス「sameClass」を持つ次の div に適用したいので、結果は次のようになります。

<div class="sameClass">
  <p>Text in here</p>
</div>
<div class="differentClass">
  <p>Text in here
</div>
<div class="sameClass selected">
  <p>Text in here</p>
</div>

私が言いたいことを理解していただければ幸いです:)

アップデート:

これが最も効果的であることがわかりました。

$(".sameClass.selected").nextAll(".sameClass:first").andSelf().toggleClass("selected")

HTMLがそのようなものである場合、私はそれで1つのバグに遭遇しました:

<p>
  <div class="sameClass">
    <p>Text in here</p>
  </div>
  <div class="differentClass">
    <p>Text in here
  </div>
  <div class="sameClass  selected">
    <p>Text in here</p>
  </div>
</p>
<p>
  <div class="sameClass">
    <p>Text in here</p>
  </div>
</p>

2 番目の P ブロックにある「sameClass」は選択されません。なぜこれが起こっているのですか?

イーフ

4

8 に答える 8

3

エレガントなソリューションは次のとおりです。

$(".sameClass.selected")
 .nextAll(".sameClass:first").andSelf()
 .toggleClass("selected")
于 2009-11-13T11:42:59.013 に答える
0
$( '.sameClass' ).each ( function () {
  var jThis = $( this );
  if ( jThis.hasClass ( 'selected' ) ) {
    jThis.removeClass ( 'selected' );
    jThis.nextAll ( '.sameClass' ).each ( function () {
      $( this ).addClass ( 'selected' );
      return false;
    } );

    return false;
  }
} );
于 2009-11-13T11:01:16.440 に答える
0

'次の'divを見つけるために常に前進しているかどうかを明確にしないでください。したがって、.nextAllを使用するか、.siblings.eq(0)を使用するかは、左と右の両方に移動するかどうかによって異なります。

var $el = $('div.selected');
$el.removeClass('selected');
   .nextAll('.' + $el.attr('class') ).eq(0)
   .addClass('selected');

また、純粋なクラスベースのセレクターではなく、セレクターでタグ名プレフィックスを使用することを忘れないでください$('div.class')$('。class')よりも99%優れています

nextAllの代わりにPSでbenalmansnextUntilプラグインを使用できます@http://github.com/cowboy/jquery-misc

于 2009-11-13T11:01:38.303 に答える
0

あなたが使用することができます:

$('.sameClass').each(function() {
  if(setNextAsSelected) {
      this.addClass('selected');
      return;
  }
  if (this.attr('class').contains('selected')) { 
      setNextAsSelected = true;
      this.removeClass('selected'); 
  }
});

または何か(主に疑似コード)。

于 2009-11-13T10:46:43.883 に答える
0

これを試して

var sel = $('.selected');
sel.removeClass('selected');
var ofSameClass = sel.siblings('.'+sel.attr('class'));
ofSameClass.eq(0).addClass('selected');
于 2009-11-13T10:48:00.747 に答える
0

Jimmeh の返信の修正

var setNextAsSelected = false;
$('.sameClass').each(function() {
    if (this.hasClass('selected')) 
    { 
      setNextAsSelected = true 
      this.removeClass('selected');
    }
    if(setNextAsSelected)
    {
       this.addClass('selected');
       setNextAsSelected =false;
    }
});
于 2009-11-13T11:05:32.177 に答える
0

私はこれを試しましたが、あなたが望むことをすると思います:

var s='selected';
var c='.sameClass';
$($(c+'.'+s).removeClass(s).nextAll(c)[0]).addClass(s)
// s and c added for brevity, probably use this expanded in source code.

最後の.sameClass要素が選択された場合は機能しませんが、これまでの他の回答も機能しません。

于 2009-11-13T11:42:00.957 に答える
-1

これを試してください:

$('.sameClass.selected')
    .removeClass('selected')
    .nextAll('.sameClass:eq(0)')
       .addClass('selected')'
于 2009-11-13T10:50:04.877 に答える