2010-03-27 22 views
12

Bir jQuery sıra listeyi oluşturdum ancak bazı öğeleri sıraya alınmış 'sabit' yerinde tutmam ve diğer öğelerin sıralamasını yapmam gerekiyor. çevrelerinde. Bunu başarmak için yöntemlerin inşa edileceğini düşündüm, bu durum böyle değil.Bir öğenin jQuery UI'de yerinde kalmasını zorluyor Sorgulanan liste

<ul id="fruit"> 
    <li class="fixed">apples</li> 
    <li>oranges</li> 
    <li>bananas</li> 
    <li>pineapples</li> 
    <li>grapes</li> 
    <li class="fixed">pears</li> 
    <li>mango</li> 
</ul> 

<script type="text/javascript"> 
    $('#fruit').sortable({items: "li:not('.fixed')"}) 
</script> 

Bu bu öğeleri bırakarak/sürükle beni durdurur ancak çevrelerindeki ürün sıralanır eğer hala hareket:

Ben listesini hazırlayıp değil söz konusu öğeleri dahil edebiliyorum. Bu yöntemin sahip olduğu birçok geri çağırma yöntemini kullanarak bunu yapmanın bir yolu olabilir, ancak bunu gerçekleştiremedim.

Belki bu yöntem UI Sortable seçeneklerine iyi bir ek olabilir?

+0

Hepsi listenin en üstünde mi yoksa altta mı olduğunu görebiliyordum - ama listenizle sıralanırsanız nasıl çalışacağını merak etmeliyim - armut hala sondan ikinci veya sabit ondan önceki ile ilişki içinde (ikincisi için bir kullanım görüyorum, birincisi için bir durum düşünemiyorum)? Birisi mangoyu armutun üstünden sürükleyebilir ve sonra onu sıralayabilir mi, şimdi armutlar listede son kalır mı? – Joe

+0

Aynı konumda (indeks) kalırlar ve sadece etraflarındaki öğeler değişirdi. Bir soru sordum: http://stackoverflow.com/questions/2519103/how-can-i-sort-an-array-yet-exclude-certain-elements-to-be-kept-at-the-same- pos Buna benzer bir teması vardır (bu durumda, yalnızca dizileri sıralama olsa da) - ancak ilke aynı – calumbrodie

cevap

4

(kod için http://jsbin.com/etubi/2/edit) bir demo için

Kontrol http://jsbin.com/etubi/2 (jenerik çözüm biraz daha zor olurdu) hala biraz çalışma ile mümkün olduğunu biraz kodlayın ve "dur" yerine "değişiklik" etkinliğine ekleyin. Bir maddeyi sürüklerken indeksin nasıl değiştiğine bakıp bazı şartlı durumlar belirledim. Aynı zamanda çoklu sabit elemanlarla çalışır. "Lockto" değişkeni sabit elemanın pozisyonunu tanımlar ve sabit eleman başlangıçta bu pozisyonda olmalıdır. Bunu muhtemelen yeniden yazabilir ve bir fonksiyona sarabilirsiniz, böylece tüm sabit elemanlar için "lockto" değişkenini manuel olarak ayarlamanız gerekmez.

$("#sortable").sortable({ 
    "cancel":"li.static", 
    "change":function(event,ui) { 
     var lockto = 6; 
     var thisindex = $(ui.helper).index(fixed);   
     var fixed = $("#static-"+lockto);   
     var index = $("#sortable li").index(fixed); 
     var targetindex = lockto+1; 
     if(index !== targetindex) {   
      if(index > targetindex) { 
       fixed.prev().insertAfter(fixed); //move it up by one position 
      } else if(index==(targetindex-1) && thisindex>targetindex) { 
       //don't move it at all 
      } else { 
       fixed.next().insertBefore(fixed); //move it down by one position 
      } 
     } else if(index==targetindex && thisindex>targetindex) { 
      fixed.prev().insertAfter(fixed); //move it up by one position 
     }  
    } 
}); 
+0

Cevabınız için teşekkürler - 10 dakika yedek aldığımda bunu test etmeye çalışacağım ;-) – calumbrodie

+0

@tester testçileri Kodunuzun tek bir sabit elemanla sorunsuz çalışmasına rağmen çok sayıda sabit elemanla iyi çalışmıyor. Lütfen bağlantıyı kontrol ediniz http://jsfiddle.net/shuklendu/hP4rm/4/ Yukarıdaki bağlantıda, 2. Öğeyi, Öğe 4'ü ve Öğe 6'yı sıralarken yerlerinde kalmalıdır. Öğe 1'i Öğe 1'e doğru yukarı itin ve Öğe 4'ü ve Madde 6'nın konumunu değiştireceğini kontrol edin. – shuklendu

1

Bu tahmin önemsiz değil. senin Mesela o ben gerginlik değiştirerek bunu başardı

$("#sortable").sortable({ 
    cancel: "li.fixed", //exclude fixed ones 
    stop:function(event, ui) { 
     //nothing to do for #f0 as you can't sort anything above it 
     var f5 = $("#f5"); 
     var indf5 = $("#sortable li").index(f5); 
     //if f5 not in right position -> swap position 
     if(indf5 !== 5) { 
      if(indf5 > 5) { 
       f5.prev().insertAfter(f5); //move it up by one position 
      } else { 
       f5.next().insertBefore(f5); //move it down by one position 
      } 
     } 
    } 
}); 
+0

Cevabınız için teşekkürler. Bu çözüm benim için çalışacaktır, ancak sıralama sırasında (sıralama bittiğinde giderilen) hareket eden öğelerle ilgili sorun hala vardır. A * mükemmel * çözüm, sıralama gerçekleşirken öğenin sabit (görsel olarak) kaldığı anlamına gelir. Mevcut olay işleyicileri sayısı ile bunun mümkün olabileceğini düşünüyorum. – calumbrodie

-2

Sen

Ex "iptal" sıralanabilir seçeneği kullanabilirsiniz:

$("#sortable").sortable({ 
    cancel: "li.group_elem" 
}); 

Bu şekilde, "group_elem" sınıf var li elemanları, sıralanabilir olmayacaktır.

+0

Bu öğeyi yerinde tamir etmiyor, sadece – musefan

+0

Radu adresinden sürüklenmesini engelliyor, sadece bu cevabı silin, itibar puanlarınızı geri alacaksınız. – SeanKendle

İlgili konular