#jquery-ui
#jquery-пользовательский интерфейс
Вопрос:
У меня есть сортируемый список с соответствующим массивом данных, мне нужно изменить порядок массива при изменении порядка списка. Я использую этот код
o.dom.$editor.find('.sortable').sortable({
start: function(event, ui) {
var start_pos = ui.item.index();
ui.item.data('startIndex', start_pos); // store original index
},
change: function(event, ui) {
var start_pos = ui.item.data('startIndex'); // get original index
var index = ui.placeholder.index() - 1; // get new index
console.log(start_pos, index); // log start and end positions for debugging
ui.item.data('startIndex', index); // store new index
}
});
В качестве примера, допустим, у меня есть этот список:
A
B
C
Я удерживаю элемент списка A и перетаскиваю его вниз, событие изменения срабатывает дважды, сначала заменяя элемент A на элемент B, затем A на C, консоль показывает:
0 1
1 2
И это правильно. Теперь (НЕ отпуская мышь от предыдущего перетаскивания) я перетаскиваю элемент A обратно наверх, снова событие изменения срабатывает дважды, заменяя A на C, затем A на B, консоль показывает:
2 1
1 0
Все хорошо.
Теперь, если я отпущу мышь и начну перетаскивать элемент B наверх, событие изменения срабатывает один раз, заменяя B на A, но консоль показывает:
1 -1
Что неверно. Что здесь происходит? Я пытался понять это в течение нескольких часов.
jsfiddle: https://jsfiddle.net/4dtdk2qo/1 /
Ответ №1:
Проблема в var index = ui.placeholder.index() - 1;
очереди.
- При перемещении элемента сверху вниз индекс для
ui.placeholder.index()
начинается с1
- при перемещении элемента снизу вверх индекс для
ui.placeholder.index()
начинается с0
Я изменил логику получения индекса.
$(function(){
$('.sortable').sortable({
start: function(event, ui) {
var start_pos = ui.item.index();
ui.item.data('startIndex', start_pos);
},
change: function(event, ui) {
var start_pos = ui.item.data('startIndex');
var index = ui.placeholder.index();
index = (start_pos > index) ? index : index - 1;
$("#output").append(start_pos ' ' index '<br>');
ui.item.data('startIndex', index);
}
});
})
li{
display: block;
background: lightgreen;
margin:20px 0;
}
#output{
width:100%;
min-height: 20px;
background: lightgray;
}
<link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<ul class='sortable'>
<li>A</li>
<li>B</li>
<li>C</li>
</ul>
<div id="output">
Комментарии:
1. Почему ui.placeholder.index() запускается с разных индексов в зависимости от того, начинаю ли я двигаться вверх или вниз? Это предполагаемое поведение?
2. @d.a.vorm, эта вещь, которую я не исследовал, я сделаю, когда у меня будет время, извините.