Le panda roux, l'event Drop et le preventDefault() [RÉSOLU]

Sous ce titre, qui siérait au conte d'un Lafontaine geek, se cache un des plus grands mystères de l'univers observable qui, pourtant, ne semble concerner que môa...

Quand je cherche à drag et drop un fichier sur un élément HTML pour en gérer l'upload via JS, je fais tout bien comme on m'a expliqué dans les tutos, les stackoverflow pis toussa:


// Une page de test qui est censée permettre de capter l'événement Drop sur un body id="body"
// version simplifiée et sans lib de mon problème
document.getElementById("body").addEventListener("drop",function(e){
        console.log(e);
        e.preventDefault();
        e.stopPropagation();
})

Hélas, quand je drope un fichier sur ma page, Firefox charge le fichier et l'affiche (ou en lance le téléchargement)

Pour faire simple  le preventDefault ne prevent absolument rien  le con.jpg

En plus, comme le chargement casse tout, impossible de vérifier dans la console que l'événement se déclenche bien dans js (même en conservant les journaux)...

Ha ça  les autres dragenter dragleave & consorts  eux  ils sont impeccablement gérés    Mais le drop  dans ton cul  si j ose dire   .jpg

  • Ça ne vient pas d'une extension, j'ai testé en mode sans échec.
  • Ça ne vient pas de ce firefox, j'ai essayé avec Waterfox, c'est pareil...
  • Ça ne vient pas de cet ordi (je ne m'étonnerais plus de rien) j'ai testé sur un autre...

Je me rappelle que j'ai déjà rencontré le souci à chaque fois que j'ai voulu faire ça mais impossible de me souvenir comment j'ai fait pour y parvenir... pire, j'ai regardé mes scripts précédents qui semblent fonctionner et il n'y a rien de particulier dedans...

Je sens bien que ça doit venir de moi  notez   .jpg

EDIT:

MErci à ArthurHoaro qui me fournit une solution qui consiste à faire un preventDefault sur l'event Dragover plutôt que sur le drop. C'est pas logique, mais ça marche !


// Une version qui va bien et qui explique pourquoi les autres codes fonctionnent: ils gèrent tous le dragover !
document.getElementById("body").addEventListener("drop",function(e){
        console.log(e);
        e.preventDefault();
        e.stopPropagation();
})
document.getElementById("body").addEventListener("dragover",function(e){
        e.preventDefault();
        e.stopPropagation();
})

En plus, ils en parlent là : https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#droptargets (mais je le découvre APRÉS, bien entendu)

❝ 4 commentaires ❞

1  ArthurHoaro le

Une petite touche de magie, et ça marche !


document.getElementById('body').addEventListener('dragover', (e) => { e.preventDefault(); });

 
2  Bronco le


YES ! ça fonctionne !
C'est pas logique logique, mais OSEF !

 
3  Jerry Wham le

Comment ? Tu n'as pas lu le manuel en entier ? Celui où il y a de nouvelles pages chaque jour et qui en compte plus de 3000 ?
Vraiment, tu ne fais pas d'effort...

 
4  Bronco le

Le temps que tu lises les specs d'ECMAscript ils sont passés à une nouvelle version...

 

Fil RSS des commentaires de cet article

✍ Écrire un commentaire

les commentaires relevant du SPAM seront filtrés et dégagés direct...

Quelle est le sixième caractère du mot d95xwjp3 ?