Le problème que je rencontre est que le dragleave
d'un élément est déclenché lors du survol d'un élément enfant de cet élément. Également, dragenter
n'est pas déclenché lorsque l'élément parent est à nouveau survolé.
J'ai fait un violon simplifié : http://jsfiddle.net/pimvdb/HU6Mk/1/ .
HTML :
<div id="drag" draggable="true">drag me</div>
<hr>
<div id="drop">
drop here
<p>child</p>
parent
</div>
avec le JavaScript suivant :
$('#drop').bind({
dragenter: function() {
$(this).addClass('red');
},
dragleave: function() {
$(this).removeClass('red');
}
});
$('#drag').bind({
dragstart: function(e) {
e.allowedEffect = "copy";
e.setData("text/plain", "test");
}
});
Ce qu'il est censé faire, c'est notifier l'utilisateur en faisant tomber la goutte div
rouge lorsque vous y faites glisser quelque chose. Cela fonctionne, mais si vous faites glisser dans le p
l'enfant, le dragleave
est déclenché et le div
n'est plus rouge. Revenons à la goutte div
ne le rend pas non plus rouge à nouveau. Il est nécessaire de sortir complètement de la goutte. div
et tirez dessus à nouveau pour le rendre rouge.
Est-il possible d'empêcher dragleave
de se déclencher lorsqu'il est glissé dans un élément enfant ?
Mise à jour de 2017 : TL;DR, Regardez CSS pointer-events: none;
comme décrit dans la réponse de @H.D. ci-dessous qui fonctionne dans les navigateurs modernes et IE11.
0 votes
Le bogue signalé par pimvdb existe toujours dans Webkit depuis mai 2012. Je l'ai contré en ajoutant également une classe dans dragover, ce qui est loin d'être agréable puisqu'il se déclenche si souvent, mais semble corriger un peu le problème.
3 votes
@ajm : Merci, cela fonctionne dans une certaine mesure. Cependant, sur Chrome, il y a un flash lors de l'entrée ou de la sortie de l'élément enfant, vraisemblablement car
dragleave
est toujours tiré dans ce cas.0 votes
J'ai ouvert un bug de jQuery UI votes positifs sont les bienvenus afin qu'ils puissent décider d'y consacrer des ressources
0 votes
@fguillen : Je suis désolé mais cela n'a rien à voir avec jQuery UI. En fait, jQuery n'est même pas nécessaire pour déclencher le bug. J'ai déjà déposé un bug WebKit mais il n'y a pas de mise à jour pour le moment.
0 votes
@pimvdb, ouais, j'ai vu la réponse dans mon bug, qui est le lien vers votre bug WebKit de toute façon je peux reproduire le même bug avec FireFox :/
0 votes
@fguillen : C'est dans les commentaires de la réponse postée (qui d'ailleurs a une solution de contournement pour Firefox).
2 votes
@pimvdb Pourquoi n'acceptez-vous pas la réponse de H.D. ?
0 votes
Le fait de ne pas avoir de css impliqué dans cette solution de contournement semble plus simple. Je l'ai fait avec des événements de pointeurs et je préfère l'option du compteur pour le moment.
1 votes
J'ai découvert que la solution la plus simple à ce problème vraiment ennuyeux, est d'écouter seulement
enter
sur l'élément, et lorsque l'événement se déclenche - créer une superposition absolument positionnée au-dessus de l'élément donné, avec seulementleave
auditeur d'événements. Cela supprime la nécessité de désactiver les événements de pointeur sur les enfants (la superposition prend en charge chaque événement de glisser) et vous êtes sûr queleave
sera viré quand il devrait l'être. J'ai eu ce problème dans un composant Vue : toujours le déclenchement de la fonctionleave
juste aprèsenter
Je n'ai pas trouvé pourquoi (les enfants n'avaient pas d'événements de pointeurs).