J'ai lié des événements à différents éléments, et lorsque je les fais glisser dans tous les navigateurs, sauf Firefox, cela fonctionne comme prévu. Dans Firefox, cependant, cela ne fonctionne pas du tout. Le seul événement qui se déclenche est dragstart
, et aucun des autres événements ne se déclenche. Que se passe-t-il?
Je n'utilise pas jQuery, j'ai donc supprimé la partie originalEvent et changé le format en texte (ou IE a eu un problème), et cela fonctionne:
event.dataTransfer.setData('text', 'anything');
Dans l'événement drop, assurez-vous d'appeler:
event.preventDefault();
Ou il passera à n'importe quoi.com.
Firefox requiert qu'un utilisateur exécute le dataTransfer.setData
fonction dans l'événement.
Pour vous jQuery
utilisateurs, cela signifie que le code suivant devrait résoudre votre problème:
function dragstartHandler(event){
event.originalEvent.dataTransfer.setData('text/plain', 'anything');
}
Les événements futurs sur la même traînée se déclencheront désormais correctement comme prévu. Évidemment, vous pouvez remplacer les arguments setData
par des données plus utiles.
FF a des problèmes de longue date avec la consommation de certains événements de souris qui proviennent d'éléments dont le débordement est défini sur automatique ou sur défilement.
Dans mon cas, j'avais une bibliothèque bien utilisée pour le glisser-déposer qui fonctionnait parfaitement dans les échantillons et dans mon application sur tous les navigateurs sauf Firefox. Après avoir fouillé les tickets liés à cela, j'ai trouvé une solution que je crédite entièrement à un contributeur à ce ticket https://bugzilla.mozilla.org/show_bug.cgi?id=33929
qui est de définir -moz-user-select: aucun
sur l'élément faisant défiler en train d'être glissé. Cela a résolu mon problème particulier.
Vous pouvez l'utiliser comme référence pour cette solution de question concernant les redirections qui se produisent sur Firefox.
Vous devez empêcher l'action par défaut dans la méthode drop pour résoudre ce problème.
function drop(e) {
if(e.preventDefault) { e.preventDefault(); }
if(e.stopPropagation) { e.stopPropagation(); }
//your code here
return false;
}
J'ai obtenu cette solution de ce lien .