Les éléments enfants sont permettant ainsi de glisser/déposer
J'ai un étrange problème avec le glisser-déposer dans html5.
Panneau Un a une liste des types d'éléments que vous pouvez faire glisser. Panneau B est l'endroit où les éléments sont déplacés. Panneau C et D sont les autres endroits où vous pouvez faire glisser des éléments, et vous pouvez faire glisser et de réorganiser les éléments entre les Panneaux B, C et D.
Mon problème est que je suis en mesure de faire glisser un élément et de le déposer à l'INTÉRIEUR d'un autre élément qui est à l'intérieur de l'un des panneaux, que je ne veux pas que l'utilisateur soit en mesure de le faire. L'enfant des éléments de ces panneaux n'ont pas de genre de javascript ou de le glisser propriétés liées attaché à eux, et pourtant ils sont actuellement en permettant que des éléments à glisser à l'intérieur d'eux.
J'ai essayé de fixer le ondrop= " return false;" et "ondragover='return false;'", mais aucune n'a fonctionné.
Il y a sûrement un moyen de désactiver la " autoriser les glisser dans la propriété sur un élément?
Voici mon code:
<div id="elem-002" draggable="true" ondragstart="drag(event)">content</div>
Le panneau principal:
<div id="panel-b" ondrop="drop(event)" ondragover="allowDrop(event)">
<div id="elem-001" draggable="true" ondragstart="drag(event)">content</div>
</div>
Le JS:
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData("Text", ev.target.id);
}
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("Text");
ev.target.appendChild(document.getElementById(data));
}
Dit d'une autre manière: je suis en mesure de faire glisser mon "elem-002" directement dans "elem-001", un élément qui a déjà été emportée. Cela provoque l'imbrication des éléments que je ne veux pas de se produire. Comment puis-je éviter cela?
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous devez régler correctement l'
ev.dataTransfer.dropEffect
dansallowDrop
. Pour votredraggable
éléments qu'il devrait être"none"
(chute n'est pas autorisé), et pour tout le reste (ou de tout autre élément où le déposant est autorisé) à"all"
Lecture de dropEffect
Live exemple:
JS:
CSS:
HTML:
Je ne suis pas sûr que ce soit la MEILLEURE solution, cependant je l'ai fait venir avec quelque chose.
J'ai changé de chute(ev) à ceci:
Ce ou d'une variante de cela évite de tout, d'être tombé dans un élément qui n'a pas eu de "ondrop" explicitement défini.
Je suis en utilisant une mesure de glisser-déposer, le mélange de la souris[bas|déplacer vers le haut|] d'un élément à être déplacés avec la résistance[enter|plus de|quitter] & drop sur un autre élément. Et je suis en utilisant des Événements pour déclencher/feu/de la répartition de la baisse de l'événement. Qui n'a pas vraiment faire une différence à la question à portée de main, je voulais juste donner le contexte.
Anyhoo, j'ai été confrontés à ce même type de problème, et après avoir cherché pendant un certain temps, et faire un peu de débogage, j'ai réalisé que l'événement.[target|srcElement] est en fait l'élément qui "envoyé" de l'événement. Donc, ce que j'ai fait était d';
rejeter toute chute où la [cible|srcElement] est le pas le " il "élément de l'événement et où" il " ne contiennent pas la [cible|srcElement] (c'est à dire pas un de ses enfants), alors seulement je permettre un traitement ultérieur;
Testé dans Chrome, FF, Opera, IE Bord && IE 11 [émulation de 7-11] sur Windows 10,
aussi IE v8.0.7601.17514 sur Windows 7 [IE7 et IE8 Compatibilité] les modes testés.
J'ai amélioré un peu sur @Zerkeras réponse en permettant à l'utilisateur de déposer n'importe où à l'intérieur de la cible, mais, plutôt que de ne pas, si l'utilisateur arrive à tomber à l'intérieur d'un élément à l'intérieur de la cible, il vient de s'ajuste où l'élément est perdu.
Remarque, j'ai ajouté un arbitraire de 3 à s'échapper de la boucle while car je me méfie de tout, des boucles qui ne sont pas garantis à s'échapper. C'est de la pure paranoïa de ma part dans ce cas particulier, mais il a été très utile lorsque j'ai été le tester.
La raison, j'ai utilisé la nouvelle variable
element
était parce que la modification directe de laev.target
semblait impossible (je ne pense pas que l'immutabilité travaillé en JavaScript? si quelqu'un sait pourquoi cela était, je suis curieux). Donc ma boucle while n'a jamais été sortie c'est pourquoi vous voyez mon paranoïaque escape clause de là.