Предотвратить падение элемента списка в JqueryUI сортируемом
У меня есть два списка #sortable1
и #sortable 2
, которые связаны с сортировками, как показано в этом .
Вы можете перетаскивать элементы списка от sortable1
до sortable 2
. Однако, если элемент сортируемый 1 содержит класс "число", я хочу предотвратить падение Сортировка2 и, таким образом, сделать перетаскиваемый элемент вернитесь в сортируемый 1.
Я использовал следующее в sortable2:
receive: function (event, ui) {
if ($(ui.item).hasClass("number")) {
$(ui.item).remove();
}
но он полностью удаляет элемент списка из обеих таблиц. Любая помощь будет оценена.
Ответы
Ответ 1
Вы можете использовать комбинацию методов beforeStop
и sortable('cancel')
для проверки перемещаемого элемента. В этом примере, при удалении элемента, я проверяю, действителен ли элемент:
- Проверка того, имеет ли элемент класс
number
- и проверка того, был ли элемент списка удален в
list2
Это немного более жестко закодированное, что я хотел бы, так что в качестве альтернативы вы можете проверить родительский элемент сброшенного элемента на this
, чтобы проверить, отличаются ли эти списки. Это означает, что вы могли бы иметь элемент number
в list1
и list2
, но они не являются взаимозаменяемыми.
$(function() {
$('ul').sortable({
connectWith: 'ul',
beforeStop: function(ev, ui) {
if ($(ui.item).hasClass('number') && $(ui.placeholder).parent()[0] != this) {
$(this).sortable('cancel');
}
}
});
});
Ответ 2
Для тех, кто читает это в будущем, как указано в briansol в комментариях к принятому ответу, он выдает ошибку
Uncaught TypeError: Cannot read property 'removeChild' of null
В документации, в частности, говорится
cancel()
Отменяет изменение текущей сортировки и возвращает ее в состояние до начала текущего сортировки. Полезно в остановке и получать функции обратного вызова.
Отмена сортировки во время других событий ненадежна, поэтому лучше использовать событие receive
, как показано в Mj Azani ответить или использовать stop
событие следующим образом:
$('#list1').sortable({
connectWith: 'ul',
stop: function(ev, ui) {
if(ui.item.hasClass("number"))
$(this).sortable("cancel");
}
});
$('#list2').sortable({
connectWith: 'ul',
});
Демо-версия
Ответ 3
Попробуйте этот пример
$('#list1').sortable({
connectWith: 'ul'
});
$('#list2').sortable({
connectWith: 'ul',
receive: function(ev, ui) {
if(ui.item.hasClass("number"))
ui.sender.sortable("cancel");
}
});
Ответ 4
После нескольких экспериментов я обнаружил, что самым простым методом является использование события remove, которое по существу только срабатывает, когда вы пытаетесь удалить элемент в новую сортировку (которая ранее была доступна как цель с использованием connectWith).
Просто добавьте это в свой сортируемый вызов:
remove:function(e,ui) {
if(ui.item.hasClass('your_restricted_classname')) return false;
},
Ответ 5
Если вам вообще не нужно перетаскивать элементы с помощью класса "номер", вы также можете ограничить всю функциональность перетаскивания элементами, которые не имеют класса "число":
$("#sortable1, #sortable2").sortable({
connectWith: ".connectedSortable",
items: "li:not(.number)"
});
Вы можете попробовать здесь: http://jsfiddle.net/60gwjsgb/1/