Событие drop не запускается в Chrome

93

Кажется, событие drop не запускается, когда я ожидал.

Я предполагаю, что событие drop срабатывает, когда перетаскиваемый элемент высвобождается выше целевого элемента, но, похоже, это не так.

Что я не понимаю?

http://jsfiddle.net/LntTL/

$('.drop').on('drop dragdrop',function(){
    alert('dropped');
});
$('.drop').on('dragenter',function(){
    $(this).html('drop now').css('background','blue');
})
$('.drop').on('dragleave',function(){
    $(this).html('drop here').css('background','red');
})
Мягкий пушок
источник
повторяющийся вопрос: stackoverflow.com/questions/19223352/jquery-ondrop-not-firing/…
bob
потенциальный ответ: stackoverflow.com/questions/8414154/…
bob

Ответы:

201

Для того , чтобы иметь событие падения происходит на сОн элементе, вы должны отменить ondragenterи ondragoverсобытие. Используя jquery и предоставленный код ...

$('.drop').on('drop dragdrop',function(){
    alert('dropped');
});
$('.drop').on('dragenter',function(event){
    event.preventDefault();
    $(this).html('drop now').css('background','blue');
})
$('.drop').on('dragleave',function(){
    $(this).html('drop here').css('background','red');
})
$('.drop').on('dragover',function(event){
    event.preventDefault();
})

Для получения дополнительной информации посетите страницу MDN .

Iamchris
источник
11
Вам не нужен ondragenter, только ondragover.
access_granted 03
1
По-прежнему нельзя, по крайней мере, при перетаскивании изображений на него в последней версии Chrome.
NoBugs
2
Все еще не работает на последней версии Chromium (Vivaldi 1.2.490.39 () (32-разрядная версия
mcsdwarken
2
С помощью responsejs вам нужно добавить обработчик onDragOver к тому же элементу.
CHAN
5
Неужели html5 dnd API ТАК плохой?
bartosz.baczek
47

Вы можете избежать неприятностей, если просто примете участие event.preventDefault()в dragoverмероприятии. Это вызовет dropсобытие.

Майкл Фальк Ведельгард
источник
2
у которого есть раскрытый крайний случай, вы также должны вызвать e.preventDefault () на dragenter, см. мой другой комментарий
zupa
5

Чтобы событие drop сработало, вам нужно назначить dropEffect во время события over, иначе событие ondrop никогда не сработает:

$('.drop').on('dragover',function(event){
    event.preventDefault();
    event.dataTransfer.dropEffect = 'copy';  // required to enable drop on DIV
})
// Value for dropEffect can be one of: move, copy, link or none
// The mouse icon + behavior will change accordingly.
боб
источник
8
На самом деле вам нужно это сделать, event.originalEvent.dataTransfer.dropEffect = "copy"потому что jQuery использует свой собственныйevent
AymKdn
1

Это не настоящий ответ, но для некоторых людей вроде меня, которым не хватает дисциплины для последовательности. Drop не сработал для меня в хроме, когда effectAllowedэффект был не тем, на который я рассчитывал dropEffect. Однако у меня это сработало в Safari. Это должно быть установлено, как показано ниже:

ev.dataTransfer.effectAllowed = 'move';

В качестве альтернативы effectAllowedможно установить как all, но я бы предпочел сохранить конкретность там, где это возможно.

для случая, когда эффект падения перемещается:

ev.dataTransfer.dropEffect = 'move';

Шис Усман
источник