ドラッグ&ドロップ (drag and drop)

<description value="AA"
  ondragstart="event.dataTransfer.setData( 'text/plain', 'BB' )" />

このdescription要素は「AA」というテキストを表示し、それをドラッグして'text/plain'を受け入れるコントロールへドロップすると、そこに「BB」というテキストが挿入されます。

DragEvent

イベント 発生タイミング
drag ドラッグされているとき。数100msごとに連続して発生
dragstart ドラッグが開始されたとき。
dragend ドラッグが終了したとき。マウスボタンが離されたり、Escキーが押されることによって発生
dragover ドロップ可能な場所の上でドラッグされているとき。数100msごとに連続して発生
dragenter ドロップ可能な場所の上にドラッグされたとき。
dragleave ドロップ可能な場所の上からドラッグが離れたとき。
drop ドロップ可能な場所にドロップされたとき。

DataTransferオブジェクト

データの受け渡し

データを渡す

void setData(
    in String type, // 追加するデータの型
    in String data  // 追加するデータ
    );
setData() - DataTransfer - Web API Interfaces | MDN

setDate()をくり返し呼ぶことで、ドラッグ データには複数のデータを追加できます。そのとき同じtypeがすでに追加されていた場合には、前のデータが置換されます。

typeには次項のドラッグ型、もしくは独自に定義した型を指定します。

データを受け取る

String getData(
    in String type
    );
getData() - DataTransfer - Web API Interfaces | MDN

typeのデータを受け取れます。指定の型が存在しなかったり、そもそもデータが含まれていない場合には空文字が返されます。先に含まれている型を知りたいならば、typesプロパティで確認できます。

このメソッドにより返されるデータは、つねに文字列です。

ドラッグの型 (Drag Types)

サンプルコード
Text
event.dataTransfer.setData( 'text/plain', 'This is text to drag' )
Links
var dt = event.dataTransfer;
dt.setData( 'text/uri-list', 'http://www.mozilla.org' );
dt.setData( 'text/plain', 'http://www.mozilla.org' );
HTML and XML
var dt = event.dataTransfer;
dt.setData( 'text/html', 'Hello there, <strong>stranger</strong>' );
dt.setData( 'text/plain', 'Hello there, stranger' );
Files
event.dataTransfer.mozSetDataAt( 'application/x-moz-file', file, 0 );
Images
var dt = event.dataTransfer;
dt.mozSetDataAt( 'image/png', stream, 0 );
dt.mozSetDataAt( 'application/x-moz-file', file, 0 );
dt.setData( 'text/uri-list', imageurl );
dt.setData( 'text/plain', imageurl );
Nodes
event.dataTransfer.setData( 'application/x-moz-node', '' )
Custom Data

					

独自に定義したデータには、独自のデータ型を定義できます。しかしその場合にも、代替のテキスト データを提供することが推奨されます。

ドラッグの効果 (Drag Effects)

ドラッグ元のデータについて、どの操作を許可するのか明示します。

event.dataTransfer.effectAllowed = 'copy';

このeffectAllowedプロパティには、下表のいずれかの値を指定します。

許可される操作
  コピー 移動 リンク
none × × ×
copy × ×
move × ×
link × ×
copyMove ×
copyLink ×
linkMove ×
all
Drag Effects - Drag Operations - Web developer guide | MDN

これらの操作は、たとえばエクスプローラでファイルをドラッグする場合には、ファイルのコピー、移動、リンクの作成に相当します。

HTMLへの適用

draggable属性

HTMLの要素でもそれにdraggable属性を設定することで、ドラッグ&ドロップをカスタマイズできます。

<span draggable="true"
  ondragstart="event.dataTransfer.setData( 'text/plain', 'BB' )">AA</span>

下のテキストを、テキストボックスへドラッグ&ドロップしてください。

[通常のテキスト] [draggable属性が設定されたテキスト]
Firefoxアドオンの情報サイトから、まとめて検索