Drop 事件未在 chrome 中触发

Posted

技术标签:

【中文标题】Drop 事件未在 chrome 中触发【英文标题】:Drop event not firing in chrome 【发布时间】:2014-02-15 21:00:20 【问题描述】:

似乎 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');
)

【问题讨论】:

重复问题:***.com/questions/19223352/jquery-ondrop-not-firing/… 潜在答案:***.com/questions/8414154/… 【参考方案1】:

为了让 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();
)

欲了解更多信息,请查看the MDN page。

【讨论】:

你不需要 ondragenter,只需要 ondragover。 仍然无法在最新的 Chromium 上运行 (Vivaldi 1.2.490.39 () (32-bit) jsfiddle.net/f282n3pt/3 使用reactjs,需要在同一个elem中添加onDragOver handler。 html5 dnd API 真的那么糟糕吗? 从 Chrome 62 开始,您确实需要 ondragenter,因为 ondragover 只会在后续鼠标移动后触发,因此您不会调用 e.preventDefault(),导致 drop 事件有时不会触发【参考方案2】:

您只需在dragover 事件上执行event.preventDefault() 就可以逃脱惩罚。这样做会触发drop 事件。

【讨论】:

有一个未覆盖的边缘情况,您也必须在 dragenter 上调用 e.preventDefault() ,请参阅我的其他评论【参考方案3】:

为了让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【参考方案4】:

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

ev.dataTransfer.effectAllowed = 'move';

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

对于放置效果为移动的情况:

ev.dataTransfer.dropEffect = 'move';

【讨论】:

以上是关于Drop 事件未在 chrome 中触发的主要内容,如果未能解决你的问题,请参考以下文章

全屏更改事件未在 Chrome 中触发

Android onChange 事件未在 contentObserver 中触发,用于 android 5 (Lollipop) 上的 chrome 历史记录

keyPress事件未在Android手机中触发

输入类型 = 范围上的 onchange 事件在拖动时未在 Firefox 中触发

Ajax AutoCompleteExtender文本框未在边缘浏览器中触发文本更改事件

JavaScript EventSource SSE 未在浏览器中触发