更优雅/有效的方式连续获得6个连续的DOM元素?

时间:2012-05-07 21:36:04

标签: javascript jquery

假设我通过此选择器获得了$e中存储的JQuery对象:

var $e = $("input[type='text'][value='" + v + "']");

v表示我在$(this).val()次迭代中获得的.each(),但它实际上并不重要,它可以是任何数值。

我想创建一个包含$e的JQuery元素集,在它之后的DOM元素,以及$e之前的6个DOM元素。

函数本身工作得很好,我每次迭代都使用这个代码:

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 Selectors page阅读后,我也找不到更简单的方法。我认为.siblings(),或更具体地JQuery('prev ~ siblings')可以用更简单的方式做到这一点,如果我可以指定jquery对象数组的范围,但我无法弄清楚如何。

HTML是通过PHP模板生成的,我宁愿避免编辑,所以我会接受不包括将给定元素包装在容器/包装器中的答案。

有没有更简单的方法来选择给定JQuery选择器的前6个元素而不将它们包装在任何容器或包装器中?

3 个答案:

答案 0 :(得分:2)

您可以使用siblings()slice()

var $e = $("input:text[value='" + v + "']");    

$e.add( $e.siblings().slice(0, 5) ).add( $e.prev() );

答案 1 :(得分:2)

尝试使用.prevAll并切片所需的元素。见下文,

DEMO

    var $prevAll = $e.prevAll();
    $e = $e.add($e.next()).add($prevAll.slice(0, 6));

修改:添加$e.add($e.next())以添加下一个元素。

答案 2 :(得分:2)

我不知道它更好,但它是另一种选择:

    var $siblings = $e.siblings().andSelf();
    var index = $siblings.index($e);

    $siblings.slice(index-6,index+2).remove();

http://jsfiddle.net/Lf3xm/5/