2016-08-03 11 views
1

nextUntilメソッドを使用してテーブル行の値を切り替えます。どのレベルの最後のリンクでもない限り正常に動作しています。たとえば、レベル1.2.2(クラス3)をクリックしているときは、下の行がすべて表示されているため、下の行がすべて非表示になっています(下の表を参照してください)。私はこれを達成するために条件を追加する必要があると信じています。しかし、どのように条件を追加するか分からない。nextUntilの条件JQueryで切り替える

クリックしたクラスレベルよりも下のクラスレベル(以下)の場合は、トグルを停止します。また、遅いプロセスであるため、これを達成できる他の方法もあります。ここで

は、コードは次のとおりです。事前に

<table id=test> 
    <tr class=1><td>Level 1</td></tr> 
    <tr class=2><td>Level 1.1</td></tr> 
    <tr class=3><td>Level 1.1.1</td></tr> 
    <tr class=3><td>Level 1.1.2</td></tr> 
    <tr class=2><td>Level 1.2</td></tr> 
    <tr class=3><td>Level 1.2.1</td></tr> 
    <tr class=3><td>Level 1.2.2</td></tr> 
    <tr class=4><td>Level 1.2.2.1</td></tr> 
    <tr class=4><td>Level 1.2.2.1</td></tr> 
    <tr class=1><td>Level 2</td></tr> 
    <tr class=2><td>Level 2.1</td></tr> 
    <tr class=3><td>Level 2.1.1</td></tr> 
    <tr class=3><td>Level 2.1.2</td></tr> 
</table> 

$(document).ready(function() { 
    $('tr.3').click(function() { 
     $(this).nextUntil('tr.3').slideToggle(); 
    }); 
}); 

ありがとう!

+0

私はこれに従うのか、なぜ 'nextUntil'を使用しているのか分かりません。 1.2.2をクリックすると、1.2.2.1(* 2)と2と2.1が隠れていることが非常に奇妙に見えます。あなたが実際に望むのは、レベルNをクリックするとN.xをトグルする必要があり、A.Nをクリックすると、A.x.xはトグルされますが、B.xはトグルされないようにすることです。 (そして最後に、上位レベルが切り替えられるたびに隠されたものを取り戻したいのですか?)もしそうなら、あなたは仕事のために別のツールを使う必要があると思います。 – Thor84no

+0

@ Thor84no、まさに私はあなたの言うことが必要でした。私は実際に私に実例を与えてください、私はちょうどJQueryを始めて、それが良いと思います –

答えて

2

を、あなたのHTMLを変更することはできませんとして構造体の場合、代替は次のとおりです。

0 IMO Thor84noの答えと同様に

$('tr').click(function(event) { 
 
    event.stopPropagation(); 
 
    var currentLevel = parseInt($(this).attr('class')), 
 
    state = $(this).hasClass('hiding'), 
 
    nextEl = $(this).next(), 
 
    nextLevel = parseInt(nextEl.attr('class')); 
 
    while (currentLevel < nextLevel) { 
 
    nextEl.toggle(state); 
 
    nextEl = nextEl.next(); 
 
    nextLevel = parseInt(nextEl.attr('class')); 
 
    } 
 
    $(this).toggleClass('hiding'); 
 
});
tr[class^="2"] td { 
 
    padding-left: 20px; 
 
} 
 
tr[class^="3"] td { 
 
    padding-left: 40px; 
 
} 
 
tr[class^="4"] td { 
 
    padding-left: 60px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table id="test"> 
 
    <tr class="1"> 
 
    <td>Level 1</td> 
 
    </tr> 
 
    <tr class="2"> 
 
    <td>Level 1.1</td> 
 
    </tr> 
 
    <tr class="3"> 
 
    <td>Level 1.1.1</td> 
 
    </tr> 
 
    <tr class="3"> 
 
    <td>Level 1.1.2</td> 
 
    </tr> 
 
    <tr class="2"> 
 
    <td>Level 1.2</td> 
 
    </tr> 
 
    <tr class="3"> 
 
    <td>Level 1.2.1</td> 
 
    </tr> 
 
    <tr class="3"> 
 
    <td>Level 1.2.2</td> 
 
    </tr> 
 
    <tr class="4"> 
 
    <td>Level 1.2.2.1</td> 
 
    </tr> 
 
    <tr class="4"> 
 
    <td>Level 1.2.2.1</td> 
 
    </tr> 
 
    <tr class="1"> 
 
    <td>Level 2</td> 
 
    </tr> 
 
    <tr class="2"> 
 
    <td>Level 2.1</td> 
 
    </tr> 
 
    <tr class="3"> 
 
    <td>Level 2.1.1</td> 
 
    </tr> 
 
    <tr class="3"> 
 
    <td>Level 2.1.2</td> 
 
    </tr> 
 
</table>
が、シンプルな、。

+0

多くのありがとうジェイミー、その速い –

+0

それは確かにtidierです。マイナーな問題は、ある要素を切り替えて親をトグルして隠すと、その要素の次のクリックは効果がないことです( 'hiding'クラスの修正以外)。 2回目のクリックで通常のように非表示になります。 – Thor84no

+0

@ Thor84あなたは有効なポイントを作りません。 'hiding'クラスは' while'ループ内にあるすべての要素から削除されるべきです:) –

0

私はこれと少し遊んでいましたが、これは最適だとは決して考えませんでしたが、少なくとも私があなたが持っていたものを微調整できたと思います。うまくいけば分かりやすいかもしれませんが、私の変更の背後にある主な原則はslideTogglenextUntilで返されたセットで直接使用するのではなく、eachを使用してそのセットのすべての要素に対して関数を呼び出します。

これに明確化または改善が必要かどうかを教えてください。

$(document).ready(function() { 
 
    $('tr').click(function() { 
 
    var toggledLevel = parseInt($(this).attr('class')); 
 
    var hiding = !$(this).hasClass('hidden'); 
 
    $(this).toggleClass('hidden'); 
 
    $(this).nextUntil('tr.' + toggledLevel).each(function() { 
 
     var $this = $(this) 
 
     var currentLevel = parseInt($this.attr('class')); 
 
     if (currentLevel > toggledLevel) { 
 
      $this.toggle(!hiding); 
 
      $this.removeClass('hidden'); 
 
     } 
 
    }); 
 
    }); 
 
});
tr[class^="2"] td { 
 
    padding-left: 20px; 
 
} 
 
tr[class^="3"] td { 
 
    padding-left: 40px; 
 
} 
 
tr[class^="4"] td { 
 
    padding-left: 60px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<table id=test> 
 
    <tr class=1><td>Class 1 - Level 1</td></tr> 
 
    <tr class=2><td>Class 2 - Level 1.1</td></tr> 
 
    <tr class=3><td>Class 3 - Level 1.1.1</td></tr> 
 
    <tr class=3><td>Class 3 - Level 1.1.2</td></tr> 
 
    <tr class=2><td>Class 2 - Level 1.2</td></tr> 
 
    <tr class=3><td>Class 3 - Level 1.2.1</td></tr> 
 
    <tr class=3><td>Class 3 - Level 1.2.2</td></tr> 
 
    <tr class=4><td>Class 4 - Level 1.2.2.1</td></tr> 
 
    <tr class=4><td>Class 4 - Level 1.2.2.1</td></tr> 
 
    <tr class=1><td>Class 1 - Level 2</td></tr> 
 
    <tr class=2><td>Class 2 - Level 2.1</td></tr> 
 
    <tr class=3><td>Class 3 - Level 2.1.1</td></tr> 
 
    <tr class=3><td>Class 3 - Level 2.1.2</td></tr> 
 
</table>

+0

多くのおかげで、その作品が、私は約40レコードと3レベル。パフォーマンスを向上させる方法はありますか –

+0

こんにちは、トップレベルをクリックしたときに、最初のクリックでは機能しませんが、2回目のクリックは機能します。あなたもパフォーマンスをチェックしてください。多くの多くのありがとう –

+0

こんにちは、どのように私はこれを改善することができますアドバイス –

1

これは、ネストされたHTML構造でなければなりませんが、それははるかに簡単だように聞こえる:

$('li').click(function(event) { 
 
    event.stopPropagation(); 
 
    $(this).children().find('li').slideToggle(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul id=test> 
 
    <li> 
 
    Level 1 
 
    <ul> 
 
     <li> 
 
     Level 1.1 
 
     <ul> 
 
      <li> 
 
      Level 1.1.1 
 
      </li> 
 
      <li> 
 
      Level 1.1.2 
 
      </li> 
 
     </ul> 
 
     </li> 
 
     <li> 
 
     Level 1.2 
 
     <ul> 
 
      <li> 
 
      Level 1.2.1 
 
      </li> 
 
      <li> 
 
      Level 1.2.2 
 
      </li> 
 
     </ul> 
 
     </li> 
 
    </ul> 
 
    </li> 
 
</ul>

+0

こんにちはジェイミー、申し訳ありませんが、私はHTMLの構造を変更することができません、この時点では変更することは困難です。 –

関連する問題