Chromeでドロップイベントが発生しない


92

期待どおりにドロップイベントがトリガーされていないようです。

ドラッグされている要素がターゲット要素の上にリリースされると、ドロップイベントが発生すると思いますが、そうではないようです。

私は何を誤解していますか?

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


回答:


195

dropイベントをdiv要素で発生させるには、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ページをご覧ください


11
ondragenterは必要ありません。ondragoverだけが必要です。
access_granted 2016

1
少なくとも最新のChromeの画像に画像をドラッグするときは、まだ立ち入り禁止です。
NoBugs 2016年

2
最新のChromium(Vivaldi 1.2.490.39()(32ビット)jsfiddle.net/f282n3pt/3
mcsdwarken

2
reactjsでは、同じelemにonDragOverハンドラーを追加する必要があります。
CHAN

5
html5 dnd APIは本当に悪いのですか?
bartosz.baczek 2017年

46

あなただけevent.preventDefault()dragoverイベントを行うことで逃げることができます。これを行うと、dropイベントが発生します。


1
カバーされていないエッジケースがある場合は、dragenterでもe.preventDefault()を呼び出す必要があります。他のコメントを参照してください
zupa

4

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.

7
event.originalEvent.dataTransfer.dropEffect = "copy"jQueryが独自に使用するため、実際に行う必要がありますevent
AymKdn

0

これは実際の答えではありませんが、一貫性の規律に欠けている私のような一部の人にとっては。effectAllowed私が設定した効果がなかったとき、ドロップはクロムで私に発砲しませんでしたdropEffect。しかし、Safariでは私にとってはうまくいきました。これは以下のように設定する必要があります:

ev.dataTransfer.effectAllowed = 'move';

または、次のeffectAllowedように設定できます。all具体性を維持したいと思います。

ドロップ効果が移動の場合:

ev.dataTransfer.dropEffect = 'move';

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.