2012-05-07 37 views
1

假设我具有存储在通过该选择器获得$e jQuery对象:更优雅/有效的方式来连续获取连续6个DOM元素?

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

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

我想要创建一个包含$e(其后面的DOM元素)以及$e之前的6个DOM元素的JQuery元素集合。

函数本身工作完全正常,我使用这个代码每次迭代:

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 objects数组的范围,但我不知道如何。

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

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

+0

这是什么>> http://jsfiddle.net/skram/Lf3xm/6/ < <接近你想要的? –

+0

值是不同的,但我看到'.slice(0,6)'似乎是我需要与以前的兄弟姐妹()。 –

+0

它确实删除了之前的6个兄弟姐妹,包括自我权利?这不就是你想要的吗? –

回答

2

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

DEMO

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

编辑:新增$e.add($e.next())添加下一个元素。

+0

只是缺少“下一个”元素。 –

+0

我的问题是为了简化前面的元素,而'.prevAll()。slice(0,6)'只是很好!非常感谢你。确切地说,我在找什么,但在以前的JQuery中找不到任何对这些方法的引用。 –

2

你可以使用siblings()slice()

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

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

难道这不是DOM顺序中前5个兄弟姐妹加上1个之前的吗?还是“兄弟姐妹”以其他顺序返回? –

2

我不知道这是任何好转,但它是另一种选择:

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

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

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

+0

是否应该删除自我+ 1?你的演示正在删除(self + 1) - > –

+0

@Vega它是。 “包含$ e,它后面的DOM元素和$ e之前的6个DOM元素。”如果你注意到他的例子,他有'$ e.add($ e.next());'。 –

+0

我明白了,这就是为什么OP有'$ e.add($ e.next());'。我错过了,但>。< –