2012-01-30 14 views
6

Estoy intentando implementar un sistema de carga de archivos similar al de gmail. Ya hice todo el problema FileUpload/AJAX y funciona perfecto. El único problema que tengo es Comentarios del usuario.¿Cuál es el evento Javascript que se desencadena cuando arrastra un archivo desde su escritorio a su navegador?

Por ejemplo ... en gmail, cuando arrastras un archivo a tu navegador (asumiendo IE9 + usuario), hay un área que aparece, permitiéndote soltar el archivo. Creo que es algún tipo de evento de JavaScript que es capturado por un marco (digamos Jquery), que me permite hacer algunas animaciones geniales en el área de colocación.

Mi pregunta es simple .. ¿Qué evento debo capturar para hacer esto? ¿Algunas ideas? ¿Lo estoy haciendo mal?

Respuesta

8

El evento principal es solo drop.

También necesitará manejar dragenter y , de lo contrario, la acción de soltar provocará una carga de los archivos caídos. Opcionalmente también puede ver dragover.

que tienen un código que registra estos manipuladores, así:

var $dz = $('#dropzone'); 
$dz.on({ 
    dragenter: dragenter, 
    dragleave: dragleave, 
    dragover: false, 
    drop: drop 
}); 

function dragenter() { 
    $dz.addClass('active'); 
}; 

function dragleave() { 
    $dz.removeClass('active'); 
}; 

function drop(e) { 
    var dt = e.originalEvent.dataTransfer; 
    if (dt) { 
     var files = dt.files; 
     ... 
    } 
    $dz.removeClass('active'); 
}; 

En este caso los dragenter y dragleave manipuladores están allí sólo para cambiar la apariencia de la zona de descenso cuando la materia está siendo arrastrado en él.

+0

¡Guay! Desearía que mi jefe quisiera esta característica. – gdoron

+0

Bueno, esto realmente funciona, pero solo cuando paso el elemento arrastrado sobre la zona de caída ... Todavía no sé dónde está la zona de caída ... así que pensé ... bueno. en lugar de $ (elemento) .on .... ill use $ ("body"). on ... Se desencadena bien, pero cuando ingreso a cualquier otro div (digamos que tengo mi página centrada con ancho fijo, así que hay un espacio vacío en ambos lados que podríamos decir "es una etiqueta corporal pura"), luego activa los manejadores de permisos ... Resolveré cómo mantener el "enter" en toda la página, y solo desencadenará el "salir" cuando en realidad abandona la zona del navegador por completo. Gracias por la ayuda –

+0

Además, es una especie de sux .. Parece que el evento "dragenter" se dispara en cada píxel que mueve el mouse. así que digamos que toco un bonito efecto de "sacudida" en la zona de caída durante 2 segundos ... bueno ... en realidad parece estar congelado, porque no para de temblar mientras sigo moviendo el mouse. –

3

Se llama drop, y las propiedades que necesita del objeto de evento estarán en la propiedad originalEvent.

$(element).on("drop",function(e){ 
    console.log(e.originalEvent) 
}); 

también tiene que desenlazar el dragenter y DragLeave en ese mismo elemento para que se dispare el evento de colocación, si no recuerdo mal.

$(element).on("dragenter dragleave", false); 
+0

buena nota sobre dragenter y dragleave: los tengo en mi código pero había olvidado que en realidad eran necesarios. – Alnitak

+0

@Alnitak - Sí, eso me dio un vuelco cuando intenté implementar esta funcionalidad por primera vez. Terminé destrozando toda la idea e yendo con arrastrar y soltar de jquery porque estoy usando un área de texto y vinculando estos eventos con el uso normal de un área de texto. –

Cuestiones relacionadas