Solo para sonar aquí, ya que he estado haciendo esto también en los últimos días. Por lo que entiendo si está vinculando el evento drop a través de jQuery, necesita acceder a ese objeto event.dataTransfer
yendo a través del objeto event.originalEvent
en el evento provisto por jQuery.
Ejemplo:
En este Ato tanto a la dragover
así como drop
eventos, ya que esto era necesario para evitar que la realización de la acción por defecto (que se encuentra que la solución aquí: Prevent the default action. Working only in chrome)
$('#dropzone').bind('dragover drop', function(event) {
event.stopPropagation();
event.preventDefault();
if (event.type == 'drop') {
console.log(event.originalEvent.dataTransfer.files);
}
});
también parece que hay un error en el que si el console.log()
event.dataTransfer
(o event.originalEvent.dataTransfer
) es archivos matriz está vacía, se señaló aquí: event.dataTransfer.files is empty when ondrop is fired?
Para responder mejor a la pregunta PO (Acabo de notar que el resto de ella, y sé que es antiguo, pero algunos uno puede encontrar útil esta información):
Mi aplicación está en jQuery, así que espero que eso está bien:
var files = [];
// Attaches to the dropzone to pickup the files dropped on it. In mine this is a div.
$("#dropzone").bind('dragover drop', function(event) {
// Stop default actions - if you don't it will open the files in the browser
event.stopPropagation();
event.preventDefault();
if (e.type == 'drop') {
files.push(event.originalEvent.dataTransfer.files);
}
});
// Attach this to a an input type file so it can grab files selected by the input
$("#file-input").bind('change', function(event) {
files.push(event.target.files);
});
// This is a link or button which when clicked will do the ajax request
// and upload the files
$("#upload-button").bind('click', function(event) {
// Stop the default actions
event.stopPropagation();
event.preventDefault();
if (files.length == 0) {
// Handle what you want to happen if no files were in the "queue" on clicking upload
return;
}
var formData = new FormData();
$.each(files, function(key, value) {
formData.append(key, value);
});
$.ajax({
url: 'upload-ajax',
type: 'POST',
data: formData,
cache: false,
dataType: 'json',
processData: false, // Don't process the files - I actually got this and the next from an SO post but I don't remember where
contentType: false, // Set content type to false as jQuery will tell the server its a query string request
success: function(data, textStatus, jqXHR) { /* Handle success */ },
error: function(jqXHR, textStatus, errorThrown) { /* Handle error */ }
});
});
También podría enlazar a los otros eventos en la respuesta aceptada para hacer efectos como desvanecer la zona de caída para que pueda verla (eso está en mi lista de tareas para mi biblioteca). Este es el núcleo de la carga real de archivos ajax que uso, sin embargo.
Realmente no tengo una manera conveniente de probar eso, pero eso es en esencia cómo lo hice (esencialmente tomé todo ese código de la biblioteca que he estado haciendo y lo adapté para adaptarlo a un bloque de código general en aquí de una manera fácil de entender). Espero que esto ayude a algunas personas. A partir de aquí, en realidad fue muy fácil seguir adelante y agregar una lista de cola de archivos, con la capacidad de eliminar archivos de la cola, por lo que este debería ser un buen punto de partida.
Creo que solo los navegadores compatibles con HTML5 pueden permitirte hacer esto. Aunque no estoy 100% seguro. – JesseBuesking
Puede hacer algunas cosas muy interesantes con arrastrar y soltar usando JavaScript nativo, como arrastrar una imagen alojada (desde un sitio web) y soltarla en un div que tenga un evento drop, luego obtener la ruta a la imagen y crear un elemento de imagen con esa ruta ya que es fuente. Sin embargo, arrastrar una imagen desde su computadora de escritorio es otra cosa completamente distinta y es más que probable que esté bloqueada. –