2012-01-30 2 views
6

Я пытаюсь реализовать систему upoload для файлов, похожую на gmail. Я уже делал все проблемы с Fileupload/AJAX, и он отлично работает. Единственная проблема, с которой я столкнулся, - Обратная связь с пользователем.Что такое событие Javascript, которое запускается при перетаскивании файла со своего рабочего стола в ваш браузер?

Например, в gmail, когда вы перетаскиваете файл в свой браузер (при условии, что пользователь IE9 +), появляется область, позволяющая отбросить файл. Я думаю, что это какое-то событие JavaScript, которое захваченный каркасом (скажем, JQuery), который позволяет мне создавать классные анимации в области перетаскивания.

Мой вопрос прост .. Какое событие я должен сделать для этого? Есть идеи? Я делаю это неправильно?

ответ

8

Главным событием является только drop.

Вам также потребуется обработать dragenter и dragleave, иначе действие drop просто вызовет загрузку отброшенных файлов. Вы также можете дополнительно посмотреть dragover.

У меня есть некоторый код, который регистрирует эти обработчик, например, так:

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'); 
}; 

В этом случае dragenter и dragleave обработчиков там просто изменить внешний вид зоны перетаскивания, когда материал затягиваются в него.

+0

Прохладный! Хотелось бы, чтобы мой босс захотел эту функцию. – gdoron

+0

Ну, это действительно любопытная работа, но только когда я пропускаю перетаскиваемый предмет над зоной выпадения. Я до сих пор не знаю, где находится зона выпадения .. так что я понял .. ну. вместо $ (element) .on .... плохо использовать $ ("body"). on ... Это срабатывает хорошо, но когда я вхожу в любой другой div (скажем, что у меня есть моя страница с фиксированной шириной, поэтому с обеих сторон есть какое-то пустое пространство, которое мы можем сказать «это чистый тег тела»), затем он запускает обработчики разрешений ... Не знаю, как поддерживать «ввод» по всей странице, и только запускает «оставить», когда он фактически покинет зону браузера. Спасибо за помощь –

+0

Кроме того, это своего рода sux .. Кажется, что триггеры «dragenter» на каждом пикселе движутся мыши! так что скажем, что я играю хороший эффект «встряхивания» на dropzone в течение 2 секунд .. ну .. на самом деле он чувствует себя как замороженный, потому что он не перестанет встряхивать, пока я продолжаю двигать мышью! –

3

Это называется drop, а свойства, необходимые для объекта события, будут находиться в свойстве originalEvent.

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

также необходимо отвязать DragEnter и DragLeave на тот же элемент для того, чтобы сгореть случай падения, если я правильно помню.

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

Хорошее примечание о драгтере и драглаве - Я их в своем коде, но забыл, что на самом деле они нужны. – Alnitak

+0

@Alnitak - Да, это бросило меня за цикл, когда я впервые попытался реализовать эту функциональность. Я закончил тем, что разобрал всю идею и пошел с перетаскиванием jquery - & - drop, потому что я использую текстовую область и привязываю к этим событиям беспорядок с нормальным использованием текстового поля. –