Estoy agregando un cargador html5 de arrastrar y soltar a mi página.
Cuando un archivo se deja caer en el área de carga, todo funciona muy bien.
Sin embargo, si accidentalmente dejo caer el archivo fuera del área de carga, el navegador carga el archivo local como si fuera una página nueva.
¿Cómo puedo prevenir este comportamiento?
¡Gracias!
javascript
jquery
html
drag-and-drop
Travis
fuente
fuente
Respuestas:
Puede agregar un detector de eventos a la ventana que llama
preventDefault()
a todos los eventos de dragover y drop.Ejemplo:
fuente
dragover
ydrop
controladores para evitar que el navegador cargue el archivo descartado. (Chrome, más reciente 2015/08/03). La solución también funciona en FF más reciente.<input type="file" />
. Es necesario verificar sie.target
es una entrada de archivo y dejar pasar tales eventos.Después de mucho jugar, descubrí que esta es la solución más estable:
Establecer ambos
effectAllow
edropEffect
incondicionalmente en la ventana hace que mi zona de colocación ya no acepte ningún dnd, independientemente de si las propiedades se configuran como nuevas o no.fuente
Para jQuery la respuesta correcta será:
Aquí
return false
se comportará comoevent.preventDefault()
yevent.stopPropagation()
.fuente
Para permitir arrastrar y soltar solo en algunos elementos, puede hacer algo como:
fuente
prueba esto:
fuente
La prevención de todas las operaciones de arrastrar y soltar de forma predeterminada puede no ser lo que desea. Es posible verificar si la fuente de arrastre es un archivo externo, al menos en algunos navegadores. He incluido una función para verificar si la fuente de arrastre es un archivo externo en esta respuesta de StackOverflow .
Modificando la respuesta de Digital Plane, podría hacer algo como esto:
fuente
e || event;
? ¿Dónde seevent
define? No importa. Parece que es un objeto global en IE? Encontré esta cita,"In Microsoft Visual Basic Scripting Edition (VBScript), you must access the event object through the window object."
aquíEn mi experiencia, este problema surge primero cuando agrega la funcionalidad de caída de archivos a una página. Por lo tanto, mi opinión es que el componente que agrega esto, también debería ser responsable de prevenir la caída fuera de la zona de caída.
En mi solución, la zona de colocación es una entrada con una clase, pero cualquier selector inequívoco funciona.
Los oyentes se agregan / eliminan automáticamente cuando se crea / destruye el componente, y otros componentes que usan la misma estrategia en la misma página no interfieren entre sí debido a stopPropagation ().
fuente
Para construir sobre el método "verificar el objetivo" descrito en algunas otras respuestas, aquí hay un método más genérico / funcional:
Llamado como:
fuente
function preventDefaultExcept(...predicates){}
. Y luegopreventDefaultExcept(isDropzone, isntParagraph)
Tengo un HTML
object
(embed
) que llena el ancho y el alto de la página. La respuesta de @ digital-plane funciona en páginas web normales, pero no si el usuario cae sobre un objeto incrustado. Entonces necesitaba una solución diferente.Si cambiamos al uso de la fase de captura de eventos , podemos obtener los eventos antes de que el objeto incrustado los reciba (observe el
true
valor al final de la llamada de escucha de eventos):Usando el siguiente código (basado en la respuesta de @ digital-plane) la página se convierte en un objetivo de arrastre, evita que las incrustaciones de objetos capturen los eventos y luego carga nuestras imágenes:
Probado en Firefox en Mac.
fuente
Estoy usando un selector de clase para múltiples áreas de carga, por lo que mi solución tomó esta forma menos pura
Basado en la respuesta de Axel Amthor, con dependencia de jQuery (alias a $)
fuente