提问人:Fabrício Matté 提问时间:5/8/2012 更新时间:5/8/2012 访问量:176
更优雅/有效的方法来连续获取 6 个连续的 DOM 元素?
More elegant/efficient way to get the 6 consecutive previous DOM elements in a row?
问:
假设我有一个 JQuery 对象存储在通过此选择器获取:$e
var $e = $("input[type='text'][value='" + v + "']");
v
表示我在迭代中获得的内容,但实际上并不重要,它可以是任何数值。$(this).val()
.each()
我想创建一个 JQuery 元素集,其中包含 、 后面的 DOM 元素和 前面的 6 个 DOM 元素。$e
$e
函数本身工作得很好,我在每次迭代中都使用以下代码:
var $e = $("input[type='text'][value='" + v + "']");
$e = $e.add($e.next());
for (i=0;i<6;i++)
$e = $e.add($e.prev());
$e.remove();
我想这有点难以解释,所以看看这个 JSFiddle。
我已将上面的代码包装在一个绑定到按钮的匿名函数中,该函数会将一个固定值传递给我的脚本。Remove line 2
v
我是 JQuery 的入门者,即使在仔细阅读了 JQuery 选择器页面后,我也找不到更简单的方法来做到这一点。我认为,如果我可以指定 jquery 对象数组的范围,那么 ,或者更具体地说,JQuery('prev ~ siblings') 可以以更简单的方式做到这一点,但我不知道如何。.siblings()
HTML 是通过 PHP 模板生成的,我宁愿避免编辑,所以我会接受不包括将给定元素包装在容器/包装器中的答案。
有没有更简单的方法来选择给定 JQuery 选择器的前 6 个元素,而无需将它们包装在任何容器或包装器中?
答:
2赞
elclanrs
5/8/2012
#1
您可以使用 和 :siblings()
slice()
var $e = $("input:text[value='" + v + "']");
$e.add( $e.siblings().slice(0, 5) ).add( $e.prev() );
评论
0赞
James Montagne
5/8/2012
这难道不是 DOM 顺序中的前 5 个兄弟姐妹加上前 1 个吗?还是按其他顺序返回?siblings
2赞
Selvakumar Arumugam
5/8/2012
#2
尝试使用并切片您需要的元素。见下文,.prevAll
var $prevAll = $e.prevAll();
$e = $e.add($e.next()).add($prevAll.slice(0, 6));
编辑:添加以添加下一个元素。$e.add($e.next())
评论
0赞
James Montagne
5/8/2012
只是缺少“下一个”元素。
0赞
Fabrício Matté
5/8/2012
我的问题是简化前面的元素,而且很巧妙!谢谢。正是我想要的,但我之前在 JQuery 中找不到任何对这些方法的引用。.prevAll().slice(0, 6)
2赞
James Montagne
5/8/2012
#3
我不知道它是否更好,但这是另一种选择:
var $siblings = $e.siblings().andSelf();
var index = $siblings.index($e);
$siblings.slice(index-6,index+2).remove();
评论
0赞
Selvakumar Arumugam
5/8/2012
它应该删除自我+1吗?您的演示正在删除 (self+1) ->
0赞
James Montagne
5/8/2012
@Vega是这样。“包含$e,它之后的 DOM 元素,以及$e之前的 6 个 DOM 元素。”如果你注意到在他的例子中,他有.$e.add($e.next());
0赞
Selvakumar Arumugam
5/8/2012
我明白了,这就是 OP 有 .我错过了,虽然>.<$e.add($e.next());
评论
.slice(0, 6)