2012-05-07 67 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());'。我錯過了,但>。< –