için iki kez çalıştırıyor görünüyor bağlı listeleri sıralamak için jQuery UI sortable kullanıyorum. Güncelleme olayı iki kez çalışıyor gibi görünüyor. İşte Neden jquery sıralanabilir güncelleme olayı ui.sender
$(".pageContent").sortable({
handle: ".quesText",
connectWith: ".pageContent",
containment: "section",
start: function(e, ui){
ui.placeholder.height(ui.item.height());
},
placeholder: "sortable-placeholder",
opacity: 0.5,
cursor: "move",
cancel: "input, select, button, a, .openClose",
update: function(e, ui){
var thisItem = ui.item;
var next = ui.item.next();
var prev = ui.item.prev();
var thisNumber = thisItem.find(".quesNumb");
var nextNumber = next.find(".quesNumb");
var prevNumber = prev.find(".quesNumb");
var tn = parseInt(thisNumber.text());
var nn = parseInt(nextNumber.text());
var pn = parseInt(prevNumber.text());
var quesNumbs = $(".quesNumb");
var newItemId = thisItem.attr("id").replace(/_\d+$/, "_");
//test if we are dragging top down
if(ui.position.top > ui.originalPosition.top){
quesNumbs.each(function(i){
var thisVal = parseInt($(this).text());
var grandparent = $(this).parent().parent();
var grandId = grandparent.attr("id").replace(/_\d+$/, "_");
if(thisVal > tn && (thisVal <= pn || thisVal <= (nn - 1))){
$(this).text(thisVal - 1 + ".");
grandparent.attr("id",grandId + (thisVal - 1));
}
});
if(!isNaN(pn) || !isNaN(nn)){
if(!isNaN(pn)){
//for some reason when there is a sender pn gets updated, so we check if sender exists
//only occurs sorting top down
if($.type(ui.sender) !== "null"){
var senderId = ui.sender.attr("id");
thisNumber.text(pn + 1 + ".");
thisItem.attr("id",senderId + "_" + (pn + 1));
alert(thisItem.attr("id"));
}
else {
thisNumber.text(pn + ".");
thisItem.attr("id",newItemId + pn);
alert(thisItem.attr("id"));
}
}
else {
thisNumber.text(nn - 1 + ".");
}
}
else {
//something will happen here
}
}
//otherwise we are dragging bottom up
else {
quesNumbs.each(function(i){
var thisVal = parseInt($(this).text());
if(thisVal < tn && (thisVal >= nn || thisVal >= (pn + 1))){
$(this).text(thisVal + 1 + ".");
}
});
if(!isNaN(pn) || !isNaN(nn)){
if(!isNaN(pn)){
thisNumber.text(pn + 1 + ".");
}
else {
thisNumber.text(nn + ".");
}
}
else {
//something will happen here
}
}
}
});
iki kez çalıştırmak gibi görünüyor parçasıdır:
if($.type(ui.sender) !== "null"){
var senderId = ui.sender.attr("id");
thisNumber.text(pn + 1 + ".");
thisItem.attr("id",senderId + "_" + (pn + 1));
alert(thisItem.attr("id"));
}
else {
thisNumber.text(pn + ".");
thisItem.attr("id",newItemId + pn);
alert(thisItem.attr("id"));
}
Ben sadece ui.sender
olarak bir tane alert
almak için bekliyorum null
zaman sıralamayı edilir Burada
ui.sender
artık
null
olacaktır.
Bir öğeyi yeni bir listeye taşıdığımda sorun, uyarı mesajlarını alacağım. Güncelleme fonksiyonu bir kez çalıştırıldıktan sonra ui.sender ayarlanırsa, güncelleme fonksiyonu üzerinden tekrar çalışır. Açıkçası bu iyi bir şey değil, çünkü üzerine yazılmaması gereken verilerin üzerine yazıyorum.
Böyle bir durum söz konusu ise, kodun üzerine yazmamak için nasıl yazmalıyım?
DÜZENLEME ben güncelleme olayı bir liste DOM genel olarak, sadece DOM her değiştiğinde denir inanıyoruz. Bu nedenle, DOM'a sahip her bir liste için güncelleme çalışır. Bir öğeyi yeni bir listeye taşıdığımda iki listeyi güncelliyorum.
Yeni soru şu: Sanırım iki kez ateş edeceğini bilerek bu kodu nasıl yeniden yazarım? Bunu başarabilecek Alma ve Kaldırma olaylarının bir kombinasyonu var mı?
Üzgünüm ama en azından bir aksaklık olduğunu düşünüyorum etkinliklerinizin sırasına göre: 'dur' son olay değil, "update".[Dan Wellman'ın kitabı «jQuery UI 1.8»] 'e (http://my.safaribooksonline.com/book/-9781849516525/the-sortables-component/ch13lvl1sec03) bana destek olmak için referans olarak bakarsak, bu açıktır "Dur" olayının, sıralama bittiğinde "güncelleme" olayı meydana geldiğinde ve DOM değiştiğinde, sıralamada gerçekleştiğini ... "Dur" dan sonra "güncelleştirme" gerçekleşeceğini ve bu şekilde oldukça mantıklı olduğunu, düşünmüyor musun – Cholesterol
@ Cholesterol, daha mantıklı olan girdi için teşekkürler. Ama burada sona eren bilgiler, her olayın test edilmesiydi. Bu olay tetiklendiğinde, console.log ("her ne olursa olsun") çağrısıyla test ettim. Bulgularım, dur etkinlikten önceki günlüğüne gönderilen güncelleme olayıydı. –
Kaynak kodu asla yalan söylemez: [sortable.js] (https://github.com/jquery/jquery-ui/blob/master/ui/sortable.js#L1281) - dur etkinlik son olaydır – tokarev