2014-01-29 33 views
2

我想在jQuery集合的開頭添加一些新元素。將元素添加到jQuery集合的開頭

add方法不會按照我想要的順序添加元素。 http://jsfiddle.net/F8Z7v/1/

的HTML

<p>p</p> 
<i>i</i> 
<b>b</b>  

JavaScript的

// will be ordered according to the order they appear on the document 
$('i').add('p').add('b'); 

// new elements will always appear at the end 
$('i').add('<u id="u"></u>'); 
$('<u id="u"></u>').add('i'); 

// taking control of the ordering using raw arrays 
var u = $('<u id="u"></u>').toArray(); 
u.push($('i')[0]) 
$(u); 

最後一個選項的作品,但它是一個有點難看。有沒有更乾淨的方法來做到這一點?

- 編輯 - 基於評論

我的解決辦法:

// Create the collection you want at the beginning 
var newElems = $('<div></div>'); 

// Push new collection to it 
newElems.push.apply(newElems, $('i, b, p')); 
+0

你能詳細說明爲什麼你必須依賴jQuery對象中元素的內部順序嗎? –

+0

爲什麼你要控制檯,.add方法? – Praveen

+0

@FrédéricHamidi我正在將現有集合與新元素集合合併,以便將它們插入到DOM中。有必要將它們合併,因爲我必須組合這些元素。 –

回答

2

jQuery的.add()不按順序添加元素。它在文檔中提到它。

不要以爲該方法會將元素按照傳遞給.add()方法的順序附加到現有的 集合中。當所有 元素都是同一文檔的成員時,來自.add()的結果集合 將按文檔順序排序;即按照 中每個元素的出現順序排列在文檔中。如果集合由來自不同文檔的元素或不在任何文檔中的元素組成 ,則排序順序未定義。要創建一個元素爲 明確定義的jQuery對象,請使用$(array_of_DOM_elements)簽名。

編號:http://api.jquery.com/add/

你將不得不只做.push,如果你想在最後集合的補充。

2

我前一段時間也有類似的問題,並解決它像這樣:

$.fn.addTo = function(array) { 
    var newArray = $(this).toArray(); 
    array.each(function(){ 
     newArray.push(this); 
    }); 
    return $(newArray); 
} 

var items = $("i").add("b").add("p"); 
items = $("<ul></ul>").addTo(items); 

而且,由於我返回jQuery對象這個addTo()方法可以是方法鏈的一部分。

0

你試過.prepend()

將由參數指定的內容插入匹配元素集合中每個 元素的開頭。

+0

我想在訂購後將它們插入DOM。如果我不必將塊集合在一起,'jQuery.prepend'可以正常工作。 –

0

您也可以使用.get()方法檢索DOM節點,並將它們傳遞到數組中$(),例如,G:

$($('#a').get().concat($('.b').get()).concat($('c').get())); 

,或者如果它足以讓只有第1個要素,然後這裏是一個簡化版本

$([ $('#a')[0], $('.b')[0], $('c')[0] ]); 

但要注意,在這種情況下未定義的值被添加到數組,如果選擇沒有匹配