J'ajoute un téléchargeur html5 glisser-déposer sur ma page.
Lorsqu'un fichier est déposé dans la zone de téléchargement, tout fonctionne très bien.
Cependant, si je dépose accidentellement le fichier en dehors de la zone de téléchargement, le navigateur charge le fichier local comme s'il s'agissait d'une nouvelle page.
Comment puis-je éviter ce comportement?
Merci!
javascript
jquery
html
drag-and-drop
Travis
la source
la source
Réponses:
Vous pouvez ajouter un écouteur d'événements à la fenêtre qui appelle
preventDefault()
tous les événements glisser-déposer.Exemple:
la source
dragover
et lesdrop
gestionnaires sont nécessaires pour empêcher le navigateur de charger le fichier déposé. (Chrome au dernier 2015/08/03). La solution fonctionne également sur la dernière version de FF.<input type="file" />
. Il est nécessaire de vérifier sie.target
un fichier est entré et de laisser passer de tels événements.Après beaucoup de bidouilles, j'ai trouvé que c'était la solution la plus stable:
La définition des deux
effectAllow
etdropEffect
inconditionnellement sur la fenêtre fait que ma zone de dépôt n'accepte plus aucun dnd, que les propriétés soient définies comme nouvelles ou non.la source
Pour jQuery, la bonne réponse sera:
Ici
return false
se comportera commeevent.preventDefault()
etevent.stopPropagation()
.la source
Pour autoriser le glisser-déposer uniquement sur certains éléments, vous pouvez faire quelque chose comme:
la source
essaye ça:
la source
Empêcher toutes les opérations de glisser-déposer par défaut n'est peut-être pas ce que vous souhaitez. Il est possible de vérifier si la source de glissement est un fichier externe, au moins dans certains navigateurs. J'ai inclus une fonction pour vérifier si la source de glissement est un fichier externe dans ce réponse StackOverflow .
En modifiant la réponse de Digital Plane, vous pouvez faire quelque chose comme ceci:
la source
e || event;
? Où estevent
défini? Ça ne fait rien. On dirait que c'est un objet global dans IE? J'ai trouvé cette citation,"In Microsoft Visual Basic Scripting Edition (VBScript), you must access the event object through the window object."
iciD'après mon expérience, ce problème survient pour la première fois lorsque vous ajoutez une fonctionnalité de suppression de fichier à une page. Par conséquent, mon avis est que le composant qui ajoute cela devrait également être responsable de la prévention des chutes en dehors de la zone de largage.
Dans ma solution, la zone de dépôt est une entrée avec une classe, mais tout sélecteur non ambigu fonctionne.
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 les uns avec les autres en raison de stopPropagation ().
la source
Pour construire sur la méthode «vérifier la cible» décrite dans quelques autres réponses, voici une méthode plus générique / fonctionnelle:
Appelé comme:
la source
function preventDefaultExcept(...predicates){}
. Et puis utilisez-le commepreventDefaultExcept(isDropzone, isntParagraph)
J'ai un HTML
object
(embed
) qui remplit la largeur et la hauteur de la page. La réponse de @ digital-plane fonctionne sur des pages Web normales, mais pas si l'utilisateur tombe sur un objet incorporé. J'avais donc besoin d'une solution différente.Si nous passons à l'utilisation de la phase de capture d'événements, nous pouvons obtenir les événements avant que l'objet intégré ne les reçoive (notez la
true
valeur à la fin de l'appel de l'écouteur d'événements):En utilisant le code suivant (basé sur la réponse de @ digital-plane), la page devient une cible de glissement, elle empêche les incorporations d'objets de capturer les événements, puis charge nos images:
Testé sur Firefox sur Mac.
la source
J'utilise un sélecteur de classe pour plusieurs zones de téléchargement, donc ma solution a pris cette forme moins pure
Basé sur la réponse d'Axel Amthor, avec une dépendance sur jQuery (alias $)
la source