Używam sortowania jQuery UI do sortowania list połączonych. Wydarzenie aktualizacji wydaje się działać dwa razy.Dlaczego zdarzenie aktualizacji w jquery sortable wydaje się działać dwukrotnie podczas testowania dla ui.sender
Oto pełna sortable wezwanie:
$(".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
}
}
}
});
Tutaj jest elementem, który wydaje się działać dwukrotnie:
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"));
}
spodziewam się dostać tylko jedną alert
jak ui.sender
jest null
podczas sortowania pozostaje na tej samej liście. Gdy element opuści listę, aby przejść do innej, wówczas ui.sender
nie będzie już null
.
Problem polega na tym, że dostanę komunikaty ostrzegawcze po przeniesieniu elementu do nowej listy. Jest tak, jakby ui.sender został ustawiony po uruchomieniu funkcji aktualizacji, a następnie ponownie uruchamia funkcję aktualizacji. Oczywiście nie jest to dobre, ponieważ nadpisuję dane, które nie muszą być nadpisywane.
Jeśli tak, to w jaki sposób powinienem przepisać mój kod, aby uniknąć nadpisywania danych?
EDIT
wierzę zdarzenie aktualizacja jest wywoływana za każdym razem, gdy lista DOM ulega zmianie, nie tylko DOM w ogóle. Tak więc dla każdej listy, która ma zmianę DOM, uruchamiana jest aktualizacja. Kiedy przenosimy jeden element do nowej listy, aktualizuję dwie listy.
Więc domyślam się, że nowe pytanie brzmi: jak przerobić ten kod, wiedząc, że wystrzeli dwa razy? Czy istnieje kombinacja zdarzeń odbierania i usuwania, które mogą to osiągnąć?
Niestety ale myślę, że istnieje co najmniej glitch w kolejności twoich wydarzeń: 'stop' nie jest ostatnim wydarzeniem, to "aktualizacja".Jeśli spojrzę na książkę [Dan Wellman's book "jQuery UI 1.8"] (http://my.safaribooksonline.com/book/-/9781849516525/the-sortables-component/ch13lvl1sec03) jako odniesienie do kopii zapasowej, to jest jasne że zdarzenie 'stop' występuje podczas sortowania, a zdarzenie' update' występuje, gdy sortowanie już się zakończyło, a DOM się zmienił ... Tak więc 'update' będzie się działo po' stop' i to całkiem logiczne, nie sądzisz? – Cholesterol
@Cholesterol dziękuję za wkład, który ma więcej sensu. Ale informacja, którą tu otrzymałem, polegała na testowaniu każdego wydarzenia. Testowałem, wywołując console.log ("cokolwiek-to-zdarzenie-jest"), kiedy to zdarzenie jest uruchamiane. Moje wyniki to wydarzenie aktualizacji, które wysłało dziennik przed zdarzeniem stop. –
Kod źródłowy nigdy nie leży: [sortable.js] (https://github.com/jquery/jquery-ui/blob/master/ui/sortable.js#L1281) - zdarzenie stop jest ostatnim wydarzeniem – tokarev