J'ai deux listes #sortable1
et #sortable 2
qui sont des sortables connectés, comme indiqué dans cet exemple .
Vous pouvez faire glisser des éléments de la liste de sortable1
à sortable 2
. Cependant, si un élément dans sortable 1 contient la classe "numéro", je veux empêcher la chute sur Sortable2 et ainsi faire tomber l’élément glissé dans triable 1 .
J'ai utilisé ce qui suit sur sortable2:
receive: function (event, ui) {
if ($(ui.item).hasClass("number")) {
$(ui.item).remove();
}
mais il supprime l’élément de la liste des deux tables. Toute aide serait appréciée.
Vous pouvez utiliser une combinaison des méthodes beforeStop
et sortable('cancel')
pour valider l'élément en cours de déplacement. Dans cet exemple , lorsqu’un élément est supprimé, je vérifie si l’élément est valide par:
number
list2
C’est un peu plus codé que je le souhaiterais. Par conséquent, vous pouvez également vérifier le parent de l’élément supprimé avec this
, afin de vérifier si les listes sont différentes. Cela signifie que vous pouvez potentiellement avoir un élément de number
dans list1
et list2
, mais ils ne sont pas interchangeables.
$(function() {
$('ul').sortable({
connectWith: 'ul',
beforeStop: function(ev, ui) {
if ($(ui.item).hasClass('number') && $(ui.placeholder).parent()[0] != this) {
$(this).sortable('cancel');
}
}
});
});
Pour ceux qui liront ceci à l’avenir, comme mentionné par briansol dans les commentaires de la réponse acceptée, cela jettera une erreur
Uncaught TypeError: Cannot read property 'removeChild' of null
La documentation dit particulièrement
Annule un changement dans le triable actuel et le rétablit dans l'état antérieur au début du tri actuel. Utile dans les fonctions stop et receive .
L'annulation du tri lors d'autres événements n'est pas fiable. Il est donc préférable d'utiliser l'événement receive
comme indiqué dans Mj Azanirépondre ou d'utiliser l'événement stop
comme suit:
$('#list1').sortable({
connectWith: 'ul',
stop: function(ev, ui) {
if(ui.item.hasClass("number"))
$(this).sortable("cancel");
}
});
$('#list2').sortable({
connectWith: 'ul',
});
Essayez cet exemple
$ ('# list1'). sortable ({ connectWith: 'ul' }); $ ('# list2'). triable ({ connectWith: 'ul', receive: function (ev, ui) { if (ui.item.hasClass ("numéro")) ui.sender.sortable ("cancel"); } });
Après quelques expériences, j'ai trouvé que de loin la méthode la plus simple consiste à utiliser l'événement remove, qui ne se déclenche que lorsque vous essayez de déposer un élément dans un nouvel objet de tri (qui était auparavant disponible en tant que cible à l'aide de connectWith).
Ajoutez simplement ceci à votre appel triable:
remove:function(e,ui) {
if(ui.item.hasClass('your_restricted_classname')) return false;
},
beforeStop: function(ev, ui) {
if ($(ui.item).hasClass('number') &&
$(ui.placeholder).parent()[0] != this) {
$(this).sortable('cancel');
}
}
essaye ça.
Si vous n'avez pas du tout besoin de pouvoir faire glisser les éléments avec la classe "numéro", vous pouvez également restreindre la fonctionnalité de glisser-déposer aux éléments qui n'ont pas la classe "numéro":
$("#sortable1, #sortable2").sortable({
connectWith: ".connectedSortable",
items: "li:not(.number)"
});
Vous pouvez l'essayer ici: http://jsfiddle.net/60gwjsgb/1/
Si a) vous n'avez que ces 2 listes, et b) vous ne vous souciez pas que votre "numéro" soit réellement déplacé, puis retiré, vous pouvez simplement l'empêcher de se faire glisser par ceci:
sort: function(event, ui) {
if(ui.item.hasClass('number')) return false;
}