5

jQuery 目前有.next(filter).nextAll(filter)但我需要一些适合其中的东西 - 实际上,a.nextWhile(filter)反复执行 next 直到过滤器不再为真,然后停止(而不是继续到最后)。

为了证明这一点,下面是一些简化的 HTML——(实际上,它是动态生成的、随机顺序/数据、更多列、正确的类名等)。

<table>
    <thead>
        <tr>
            <th>...</th>
        </tr>
    </thead>
    <tbody>

        <tr class="x"><td>a <button>Show/Hide</button></td></tr>
            <tr class="x y"><td>a1</td></tr>
            <tr class="x y"><td>a2</td></tr>

        <tr class="z"><td>b</td></tr>

        <tr class="z"><td>c</td></tr>

        <tr class="x"><td>d <button>Show/Hide</button></td></tr>
            <tr class="x y"><td>d1</td></tr>
            <tr class="x y"><td>d2</td></tr>
            <tr class="x y"><td>d3</td></tr>

        <tr class="z"><td>e</td></tr>

        <tr class="x"><td>f</td></tr>

        <tr class="x"><td>g <button>Show/Hide</button></td></tr>
            <tr class="x y"><td>g1</td></tr>
            <tr class="x y"><td>g2</td></tr>

    </tbody>
</table>

并针对此运行一些 JavaScript:

<script type="text/javascript">
    var $j = jQuery.noConflict();

    $j().ready(init);

    function init()
    {
        $j('tr.y').hide();
        $j('tr.x button').click( toggleRelated );
    }

    function toggleRelated()
    {
        // Only toggles one row
        // $j(this).parents('tr').next('.y').toggle();

        // Toggles unrelated ones also
        $j(this).parents('tr').nextAll('.y').toggle();

        // Not currently a jQuery construct
        // $j(this).parents('tr').nextWhile('.y').toggle();
    }

</script>

有没有一种简单的方法来实现这个nextWhile结构?

理想情况下,这需要在不修改当前 HTML 的情况下实现。

4

3 回答 3

6

在 jQuery 中,您可以使用方法和选择器创建nextWhile()等效项。简单的说,和说的一样。nextUntil():notwhile (condition is true) { do something }until (condition is false) { do something }

考虑这个技巧示例,您需要选择.child第一个之后的所有元素.parent

<ul id="test">
  <li class="parent"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="divider"></li>
  <li class="parent"></li>
  <li class="child"></li>
  <li class="child"></li>
  <li class="child"></li>
</ul>

下面的代码大致相当于.nextWhile(".child")并选择了三个.child元素:

$("#test .parent:first").nextUntil(":not(.child)");
于 2013-03-19T08:55:22.350 回答
1

更新:放弃递归的想法,决定计数和切片(见最后一个例子)。

初始尝试:
此代码有问题 - 它仅返回最后两项,因此不适用于 3+ 项。

jQuery.fn.nextWhile = function(f)
{
    if( this.next(f).html() )
    {
        return this.next(f).nextWhile(f).andSelf();
    }
    else
    {
        return this;
    }
};


当前版本:

jQuery.fn.nextWhile = function(f)
{
    var Next = this.next(f);
    var Pos = 0;

    while( Next.length > 0 )
    {
        Pos++;
        Next = Next.next(f);
    }

    return this.nextAll(f).slice(0,Pos);
}

这似乎工作正常,但我不确定选择所有内容然后只从中切片是否有任何性能损失?

于 2009-02-12T14:01:32.327 回答
0

我的版本:

$.fn.extend({
  nextWhile: function(selector) {
    var $result = $([]);
    this.each(function() {
      var $next = $(this).next();
      while ($next.is(selector)) {
        $result = $result.add($next);
        $next = $next.next();
      }
    });
    return $result;
  }
});
于 2015-07-07T11:00:59.503 回答