Note : Bien que l'OP n'ait pas demandé une solution Angular, je suis venu ici pour la chercher. C'est donc pour partager ce que j'ai trouvé être une solution viable, si vous utilisez Angular.
D'après mon expérience, ce problème se pose d'abord lorsque vous ajoutez la fonctionnalité de dépôt de fichiers à une page. Par conséquent, je pense que le composant qui ajoute cette fonctionnalité doit également être responsable de la prévention du dépôt en dehors de la zone de dépôt.
Dans ma solution, la zone de dépôt est une entrée avec une classe, mais tout sélecteur non ambigu fonctionne.
import { Component, HostListener } from '@angular/core';
//...
@Component({
template: `
<form>
<!-- ... -->
<input type="file" class="dropzone" />
</form>
`
})
export class MyComponentWithDropTarget {
//...
@HostListener('document:dragover', ['$event'])
@HostListener('drop', ['$event'])
onDragDropFileVerifyZone(event) {
if (event.target.matches('input.dropzone')) {
// In drop zone. I don't want listeners later in event-chain to meddle in here
event.stopPropagation();
} else {
// Outside of drop zone! Prevent default action, and do not show copy/move icon
event.preventDefault();
event.dataTransfer.effectAllowed = 'none';
event.dataTransfer.dropEffect = 'none';
}
}
}
Les écouteurs sont ajoutés/supprimés automatiquement lorsque le composant est créé/détruit, et les autres composants utilisant la même stratégie sur la même page n'interfèrent pas entre eux grâce à la fonction stopPropagation().
2 votes
Je suis juste curieux de savoir quel code vous utilisez pour gérer le téléchargement html5 par glisser/déposer. Merci.
0 votes
Le problème que vous rencontrez est dû à l'absence de e.dataTransfer() ou de preventDefault() sur les événements drop/dragenter/etc. Mais je ne peux pas le dire sans un exemple de code.