Drop 事件未在 chrome 中触发

IT技术 javascript jquery events drag-and-drop jquery-events
2021-03-05 18:52:53

似乎在我期望的时候没有触发 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');
})
4个回答

为了在 div 元素上发生 drop 事件,您必须取消ondragenterondragover事件。使用 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 页面

html5 dnd API 真的那么糟糕吗?
2021-04-23 18:52:53
使用 reactjs,您需要将 onDragOver 处理程序添加到同一个元素。
2021-05-04 18:52:53
你不需要ondragenter,只需要ondragover。
2021-05-16 18:52:53
仍然不适用于最新的 Chromium (Vivaldi 1.2.490.39 () (32-bit) jsfiddle.net/f282n3pt/3
2021-05-19 18:52:53
从 Chrome 62 开始,您确实需要 ondragenter,因为 ondragover 只会在后续鼠标移动后触发,因此您不会调用 e.preventDefault(),导致 drop 事件有时不会触发
2021-05-19 18:52:53

您只需event.preventDefault()dragover活动做一个可以逃脱这样做会触发drop事件。

有一个未覆盖的边缘情况,您也必须在 dragenter 上调用 e.preventDefault(),请参阅我的其他评论
2021-05-18 18:52:53

为了触发 drop 事件,您需要在 over 事件期间分配一个 dropEffect,否则 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.
实际上你需要这样做,event.originalEvent.dataTransfer.dropEffect = "copy"因为 jQuery 使用它自己的event
2021-05-17 18:52:53

这不是一个实际的答案,但对于像我这样缺乏一致性纪律的人来说。effectAllowed我设置的效果不是我为dropEffect. 然而,它在 Safari 中对我有用。这应该设置如下:

ev.dataTransfer.effectAllowed = 'move';

或者,effectAllowed可以设置为all,但我更愿意尽可能保持特异性。

对于下落效果是移动的情况:

ev.dataTransfer.dropEffect = 'move';