Просто чтобы поболтать здесь, как я делал это также последние пару дней.Из того, что я понимаю, если вы связываете событие отбрасывания через jQuery, вам нужно получить доступ к этому объекту event.dataTransfer
, пройдя через объект event.originalEvent
в событии, предоставленном jQuery.
Пример:
В этом я связываюсь как с событиями dragover
, так и drop
, так как это было необходимо для предотвращения выполнения действия по умолчанию (здесь найдено это решение: Запрет действия по умолчанию. Работает только в Chrome)
$('#dropzone').bind('dragover drop', function(event) {
event.stopPropagation();
event.preventDefault();
if (event.type == 'drop') {
console.log(event.originalEvent.dataTransfer.files);
}
});
Также, похоже, есть ошибка, при которой, если вы console.log()
массив event.dataTransfer
(или event.originalEvent.dataTransfer
), его файл пуст, он указан здесь: event.dataTransfer.files пусто, когда ondrop запущено?
Чтобы лучше ответить на вопрос OPs (я только что заметил остальную часть, и я знаю, что он старый, но кто-то может найти это полезным):
Моя реализация в jQuery, так что я надеюсь, что все в порядке:
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 */ }
});
});
Вы также можете привязать другие события в принятом ответе для выполнения таких эффектов, как постепенное исчезновение дропзоны, чтобы вы моглимогу видеть это(это в моем списке задач для моей библиотеки).Это ядро фактической загрузки ajax-файлов, которую я использую, однако.
У меня нет действительно удобного способа проверить это, но, по сути, я так и сделал (по сути, я взял весь этот код избиблиотека, которую я создавал, и адаптировал ее так, чтобы она легко вписывалась в общий блок кода).Надеюсь, это поможет некоторым людям.Начиная с этого момента на самом деле было очень легко идти вперед и добавлять в список очереди файлов возможность удалять файлы из очереди, так что это должно быть довольно хорошей отправной точкой.