jQuery UI Сортируемый, как определить текущее местоположение и новое местоположение в событии обновления? - PullRequest
43 голосов
/ 21 октября 2009

у меня есть:

<ul id="sortableList">
     <li>item 1</li>
     <li>item 2</li>
     <li>item 3</li>
</ul>

Я подключен к update: function(event, ui) { }, но не уверен, как получить исходную и новую позицию элемента. Если я перемещу элемент 3 выше элемента 1, я хочу, чтобы исходная позиция была 2 (индекс на основе 0), а новая позиция элемента 3 была 0 .

Ответы [ 6 ]

87 голосов
/ 09 декабря 2011
$('#sortable').sortable({
    start: function(e, ui) {
        // creates a temporary attribute on the element with the old index
        $(this).attr('data-previndex', ui.item.index());
    },
    update: function(e, ui) {
        // gets the new and old index then removes the temporary attribute
        var newIndex = ui.item.index();
        var oldIndex = $(this).attr('data-previndex');
        $(this).removeAttr('data-previndex');
    }
});
17 голосов
/ 28 июня 2013

Когда вызывается функция обновления, ui.item.sortable не обновлялся, однако элемент пользовательского интерфейса визуально перемещался.
Это позволяет вам в функции обновления получить старую позицию и новую позицию.

   $('#sortable').sortable({    
        update: function(e, ui) {
            // ui.item.sortable is the model but it is not updated until after update
            var oldIndex = ui.item.sortable.index;

            // new Index because the ui.item is the node and the visual element has been reordered
            var newIndex = ui.item.index();
        }    
});
10 голосов
/ 21 октября 2009

У вас есть несколько возможностей проверить старую и новую позицию. Я бы положил их в массивы.

$('#sortable').sortable({
    start: function(e, ui) {
        // puts the old positions into array before sorting
        var old_position = $(this).sortable('toArray');
    },
    update: function(event, ui) {
        // grabs the new positions now that we've finished sorting
        var new_position = $(this).sortable('toArray');
    }
});

И тогда вы можете легко извлечь то, что вам нужно.

5 голосов
/ 16 мая 2011

Я искал ответ на тот же вопрос. основываясь на том, что сделал Фрэнки, я смог получить как начальные, так и конечные «заказы». У меня была проблема с областью действия переменной, использующей var, поэтому я просто сохранил их как .data () вместо локальных переменных:

$(this).data("old_position",$(this).sortable("toArray"))

и

$(this).data("new_position",$(this).sortable("toArray"))

теперь вы можете вызвать его так (из функций обновления / завершения):

console.log($(this).data("old_position"))
console.log($(this).data("new_position"))

Кредит по-прежнему идет Фрэнки:)

3 голосов
/ 25 ноября 2014

Это сработало для меня

$('#sortable').sortable({
start: function(e, ui) {
    // puts the old positions into array before sorting
    var old_position = ui.item.index();
},
update: function(event, ui) {
    // grabs the new positions now that we've finished sorting
    var new_position = ui.item.index();
}
});
1 голос
/ 30 марта 2016

Это работает для меня,

$('#app').sortable({
    handle: '.handle',

    start: function(evt, ui){
        $(ui.item).data('old-ndex' , ui.item.index());
    },

    update: function(evt, ui) {
        var old_index = $(ui.item).data('old-ndex');
        var new_index = ui.item.index();

        alert('old_index -'+old_index+' new index -'+new_index);

    }
});
...