jQuery - 对“nextWhile”的建议 穿越?
jQuery 目前有 .next(filter)
和 .nextAll(filter)
但我需要一些适合它们中间的东西 - 实际上,一个 .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 的情况下实现。
jQuery currently has .next(filter)
and .nextAll(filter)
but I need something that fits in the middle of these - effectively, a .nextWhile(filter)
that repeatedly does next until the filter is no longer true, then stops (rather than continuing to the end).
To demonstrate this, the following is some simplified HTML - (in reality, it is dynamically generated, random order/data, more columns, proper class names, and so on).
<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>
And against this some JavaScript is run:
<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>
Is there an easy way to implement this nextWhile
construct?
Ideally this needs to be achieved without modifying the current HTML.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 jQuery 中,您可以使用
nextUntil()
nextWhile() > 方法和:not
选择器。 简单地说,while (condition is true) { do some }
与until (condition is false) { do some }
相同>。考虑这个技巧示例,您需要选择第一个
.parent
之后的所有.child
元素:以下代码大致相当于
.nextWhile (".child")
并选择三个.child
元素:In jQuery you can create
nextWhile()
equivalent usingnextUntil()
method and:not
selector. Simply put,while (condition is true) { do something }
is same as sayinguntil (condition is false) { do something }
.Consider this trick example where you are required to select all
.child
elements that follow the first.parent
:The following code is roughly equivalent to
.nextWhile(".child")
and selects the three.child
elements:更新:放弃递归想法并决定计数和切片(参见最后一个示例)。
初始尝试:
此代码有错误 - 它只返回最后两项,因此不适用于 3 个以上的项目。
当前版本:
这似乎工作正常,但是我不确定选择所有内容然后只从中删除少数内容是否会导致性能下降?
UPDATE: Gave up on the recursion idea and decided to count and slice (see last example).
Initial Attempt:
This code is buggy - it only returns the last two items, so doesn't work for 3+ items.
Current Version:
This appears to work fine, but I'm not sure if there are any performance penalties to selecting everything and then slicing only a handful from it?
我的版本:
My version: