2013-02-14 18 views
18

benim sayfasında aşağıdaki DIV'leri vardır: jQuery kodu $("div[id*=pi_div]") kullanarak divs seçmek çalışıyorumjQuery'de seçilirken DOM öğeleri nasıl sıralanır?

<div id="pi_div3"> 
    Div 3 
</div> 
<div id="pi_div2"> 
    Div 2 
</div> 
<div id="pi_div1"> 
    Div 1 
</div> 
<div id="pi_div6"> 
    Div 6 
</div> 
<div id="pi_div5"> 
    Div 5 
</div> 
<div id="pi_div4"> 
    Div 4 
</div> 

.

Seçicideki her bir() işareti kullandığımda, kimlikleri temel alınarak sıralanmış divlara ihtiyacım var. DIV'lerden geçerken, sipariş şu şekilde olmalıdır: PI_DIV1, PI_DIV2, PI_DIV3, PI_DIV4, PI_DIV5, PI_DIV6. Bunu jQuery'de nasıl yapabilirim? Diğer cevaplar id pi_div bölümünü kaldırarak neden merak ve anladım:

+0

Sıralama * sonra *, * sırasında *. 'jQuery (..)', bir "dizi gibi" nesnesini döndürür ve bir özel karşılaştırma işlevi alabilen bir "Array.sort" vardır. [nasıl-may-i-sort-a-list-alfabetik kullanan-jquery] [1] [1]:: İşte –

+0

bir çözüldü benzer soru http: // stackoverflow. com/questions/1134976/how-may-i-sort-a-list-alfabetik-kullanarak-jquery – Oliver

cevap

17

Sen .each()

$("div[id*=pi_div]").sort(function(a,b){ 
    if(a.id < b.id) { 
     return -1; 
    } else { 
     return 1; 
    } 
}).each(function() { console.log($(this).attr("id"));}); 

EDIT çağırmadan önce .sort() çağırabilir. pi_div10 "dizeleri" ile karşılaştırırsanız, pi_div2'dan önce gelir.

+1

@HRK: Bir başkasının cevabını kabul etmelisiniz, çünkü benim eleman sayınız sınırlı. Genel olarak neden çalışmadığını açıklamasına izin verdim – koopajah

+0

Bu işlev bozuk. Doğru sonucu oluşturmayacak dize değerlerini karşılaştırır. – Tomalak

+0

@Tomalak> Bu cevapta açıkça yazılmıştır ve HRK'dan başka birini kabul etmesini rica ettim. Aynı hatayı yapan birini önlemek için onu bırakmak istedim. – koopajah

1

Array.sort yöntemini kullanırdım. http://jsfiddle.net/LJWrg/

var divArr = $("div[id*=pi_div]"); 
function cleanId(id) { 
    return parseInt(id.replace("pi_div",""),10); 
} 
Array.prototype.sort.call(divArr,function(a,b) { 
    return cleanId(a.id) > cleanId(b.id); 
}); 
divArr.each(function(){ 
    console.log(this.id); 
}); 

Eğer (ancak belgesiz yöntemler kullanır) Buna http://jsfiddle.net/LJWrg/1/ kısaltmak böylece jQuery, içten tanımlanan bu yöntemle geliyor:

var divArr = $("div[id*=pi_div]"); 
function cleanId(id) { 
    return parseInt(id.replace("pi_div",""),10); 
} 
divArr.sort(function(a,b) { 
    return cleanId(a.id) > cleanId(b.id); 
}); 
divArr.each(function(){ 
    console.log(this.id); 
}); 
6
$("div[id^=pi_div]").sort(function (a, b) { 
    return a.id.replace('pi_div', '') > b.id.replace('pi_div', ''); 
}).foo(); 

http://jsfiddle.net/KrX7t/

+0

jQuery'nin '.sort() 'yönteminin dahili kullanım için tasarlandığını ve amacına göre belgelenmediğine dikkat edin. – Blazemonger

+1

Kesinlikle hayır, bir dizi değil ya da 'toArray()' yöntemine sahip olması gerekmeyecek. Ama bir ördeğe benziyor ve bir ördeğe benziyor. – Blazemonger

+3

@Blazemonger .sort yöntemi, yalnızca yerel Array.prototype.sort yönteminden devralınmıştır. Bu jQuery değil, harici kullanım için tasarlanmıştır ve belgelenmemiş çünkü jquery'nin bir parçası değil. – y3sh

5

Eğer varsa Ayrıca bunları görsel olarak görsel olarak sıralamak isteriz:

$('div[id^="pi_div"]').sort(function (a, b) { 
    var re = /[^\d]/g; 
    return ~~a.id.replace(re, '') > ~~b.id.replace(re, ''); 
}) 
.appendTo("#container"); 

Değerleri tamsayılara dönüştüren ~~'u not edin, aksi takdirde bunlar dizeler olarak karşılaştırılır.

Bkz. http://jsfiddle.net/Xjc2T/

+1

"parseInt" işlevini kullanır veya '+' kullanarak sayılara dönüştürürüm. Biraz daha açık. – Blazemonger

+3

@Blazemonger Şey, haklısınız, aynı şey olurdu. Ancak, '' '' 'ayrıca tanımsız' ve 'Sonsuzluk''ı da kullanır, ben de onu kullanmayı tercih ederim. – Tomalak

+1

DOM üçünde öğelerin sıralamasını güncelleyen '.appendTo ('# container')' ı eklediğiniz için teşekkür ederiz. –