Подія падіння не спрацьовує в хромі


92

Здається, подія падіння не спрацьовує тоді, коли я очікував.

Я припускаю, що подія 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/8414154/…
bob

Відповіді:


195

Для того, щоб подія падіння відбулася в елементі div, ви повинні скасувати події ondragenterand 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 .


11
Вам не потрібен ондрагентер, лише ондраговер.
access_granted 03.03.16

1
Досі заборонено, принаймні при перетягуванні зображень на це в найновішій версії Chrome.
NoBugs

2
Досі не працює на останньому Chromium (Vivaldi 1.2.490.39 () (32-розрядна версія
mcsdwarken

2
За допомогою Reactjs вам потрібно додати обробник onDragOver до тієї ж елемента.
ЧАН

5
Чи справді API html5 dnd НАСТАЛЬКО ЦЕ погано?
bartosz.baczek

46

Ви можете піти, просто взявши участь event.preventDefault()у dragoverзаході. Це призведе до активації dropподії.


1
у якого є непокритий край, ви також повинні зателефонувати e.preventDefault () на dragenter, див. мій інший коментар
зупа

4

Для того, щоб запустити подію 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.

7
Насправді це потрібно зробити, event.originalEvent.dataTransfer.dropEffect = "copy"тому що jQuery використовує свою власнуevent
AymKdn

0

Це не реальна відповідь, але для таких людей, як я, яким бракує дисципліни для послідовності. Крапля не вистрілила для мене в хромі, коли effectAllowedефект, який я призначив, не був dropEffect. Однак це працювало для мене в Safari. Це слід встановити, як показано нижче:

ev.dataTransfer.effectAllowed = 'move';

Як варіант, effectAllowedможна встановити як all, але я хотів би зберегти конкретність там, де це можливо.

для випадку, коли рухається ефект падіння:

ev.dataTransfer.dropEffect = 'move';

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.