Edition for Web Developers — Last Updated 13 November 2024
Support in all current engines.
このセクションは、イベントベースのドラッグアンドドロップのメカニズムを定義する。
この仕様は、ドラッグアンドドロップ操作が実際に何であるかを正確に定義しない。
ポインティングデバイスをもつ視覚メディア上に、ドラッグ操作は一連のmousemove
イベントが続くmousedown
イベントのデフォルトアクションであるかもしれず、ドロップは解放されているマウスによって引き起こされるかもしれない。
ポインティングデバイス以外の入力モダリティを使用する場合、ユーザーはおそらくドラッグアンドドロップ操作を実行するために明示的に意思表示する必要があり、それらがドラッグを望み、ドロップを望む場所を、それぞれ主張する。
要素をドラッグ可能にするためには、要素にdraggable
属性を与え、ドラッグされているデータを格納するdragstart
ドラッグに対してイベントリスナーを設定する。
イベントハンドラーは典型的に、それがドラッグされているテキスト選択でないことをチェックする必要があり、次にDataTransfer
オブジェクトにデータを格納し、許可される効果(コピー、移動、リンク、またはいくつかの組み合わせ)を設定する必要がある。
たとえば:
< p > What fruits do you like?</ p >
< ol ondragstart = "dragStartHandler(event)" >
< li draggable = "true" data-value = "fruit-apple" > Apples</ li >
< li draggable = "true" data-value = "fruit-orange" > Oranges</ li >
< li draggable = "true" data-value = "fruit-pear" > Pears</ li >
</ ol >
< script >
var internalDNDType = 'text/x-example' ; // set this to something specific to your site
function dragStartHandler( event) {
if ( event. target instanceof HTMLLIElement) {
// use the element's data-value="" attribute as the value to be moving:
event. dataTransfer. setData( internalDNDType, event. target. dataset. value);
event. dataTransfer. effectAllowed = 'move' ; // only allow moves
} else {
event. preventDefault(); // don't allow selection to be dragged
}
}
</ script >
ドロップを受け入れるために、次のイベントをリッスンする必要がある:
dragenter
イベントハンドラーは、イベントをキャンセルすることによって、ドロップターゲットが潜在的にドロップを受け入れる可能性があるかどうかを報告する。dragover
イベントハンドラーは、イベントに関連付けられたDataTransfer
のdropEffect
属性を設定することによって、ユーザーに表示されるフィードバックを指定する。このイベントはまたキャンセルする必要がある。drop
イベントハンドラーは、ドロップを受け入れるまたは拒否する最終選択を持つ。ドロップが受け入れられる場合、イベントハンドラーはターゲットに対してドロップ操作を実行しなければならない。このイベントはキャンセルする必要があるため、dropEffect
属性の値をソースによって使用できるようにする。そうでなければ、ドロップ操作は拒否される。たとえば:
< p > Drop your favorite fruits below:</ p >
< ol ondragenter = "dragEnterHandler(event)" ondragover = "dragOverHandler(event)"
ondrop = "dropHandler(event)" >
</ ol >
< script >
var internalDNDType = 'text/x-example' ; // set this to something specific to your site
function dragEnterHandler( event) {
var items = event. dataTransfer. items;
for ( var i = 0 ; i < items. length; ++ i) {
var item = items[ i];
if ( item. kind == 'string' && item. type == internalDNDType) {
event. preventDefault();
return ;
}
}
}
function dragOverHandler( event) {
event. dataTransfer. dropEffect = 'move' ;
event. preventDefault();
}
function dropHandler( event) {
var li = document. createElement( 'li' );
var data = event. dataTransfer. getData( internalDNDType);
if ( data == 'fruit-apple' ) {
li. textContent = 'Apples' ;
} else if ( data == 'fruit-orange' ) {
li. textContent = 'Oranges' ;
} else if ( data == 'fruit-pear' ) {
li. textContent = 'Pears' ;
} else {
li. textContent = 'Unknown Fruit' ;
}
event. target. appendChild( li);
}
</ script >
ディスプレイからオリジナルの要素(ドラッグされたもの)を削除するために、dragend
イベントを使用できる。
ここで私たちの例のために、それはそのイベントを処理するために元のマークアップを更新することを意味する:
< p > What fruits do you like?</ p >
< ol ondragstart = "dragStartHandler(event)" ondragend = "dragEndHandler(event)" >
...as before...
</ ol >
< script >
function dragStartHandler( event) {
// ...as before...
}
function dragEndHandler( event) {
if ( event. dataTransfer. dropEffect == 'move' ) {
// remove the dragged element
event. target. parentNode. removeChild( event. target);
}
}
</ script >
ドラッグデータストアとして知られる、ドラッグアンドドロップ操作を支えるデータは次の情報で構成される:
ドラッグされたデータを表すアイテムのリストであるドラッグデータストアアイテムリストは、次の情報で構成される:
データの種類:
テキスト。
ファイル名をもつバイナリーデータ。
一般にMIMEタイプで指定される、データ型やフォーマットを与えるユニコード文字列。MIMEタイプでない一部の値は、レガシー理由により特別扱いされる。APIはMIMEタイプの使用を強制しない。他の値も同様に使用できる。しかし、すべての場合において値は、APIによってすべてASCII小文字に変換される。
項目型文字列ごとに1つのアイテム型文字列の制限が存在する。
ファイル名(それ自体Unicode文字列)をもつ一部の場合において、ドラッグデータアイテムの種類ごとのように、Unicodeまたはバイナリー文字列。
ドラッグデータストア項目リストは、項目がリストに追加された順序で並べられ、最近では最後に追加された。
ドラッグ中のUIフィードバックを生成するために使用される、以下の情報:
次のいずれかであるドラッグデータストアモード:
dragstart
イベントに対して。新しいデータはドラッグデータストアに追加できる。
drop
イベントに対して。ドラッグされたデータを表す項目のリストは、データも含めて、読み取り可能である。新たなデータは追加できない。
他のすべてのイベントに対して。ドラッグされたデータを表す項目のドラッグデータストアリストでフォーマットおよび種類は列挙されるが、データ自体が使用できず、新たなデータは追加できない。
文字列である、ドラッグデータストアの許可された効果の状態。
ドラッグデータストアが作成された場合、それはそのドラッグデータストアアイテムリストが空であるように初期化されなければならず、それはドラッグデータストアのデフォルトフィードバックを持たず、ドラッグデータストアのビットマップおよびドラッグデータストアのホットスポット座標を持たず、そのドラッグデータストアモードは保護モードであり、そのドラッグデータストアの許可された効果の状態は文字列"uninitialized
"である。
DataTransfer
インターフェイスSupport in all current engines.
DataTransfer
オブジェクトは、ドラッグアンドドロップ操作を支えるドラッグデータストアを公開するために使用される。
dataTransfer = new DataTransfer()
空のドラッグデータストアをもつ新しいDataTransfer
オブジェクトを作成する。
dataTransfer.dropEffect [ = value ]
現在選択されている操作の種類を返す。操作の種類がeffectAllowed
属性によって許可されるものの1つでない場合、操作は失敗する。
選択した操作を変更す設定が可能である。
可能な値は、"none
"、"copy
"、"link
"、および"move
"である。
dataTransfer.effectAllowed [ = value ]
許可される操作の種類を返す。
許可される操作を変更するために、(dragstart
イベント中に)設定可能である。
可能な値は、"none
"、"copy
"、"copyLink
"、"copyMove
"、"link
"、"linkMove
"、"move
"、"all
"、および"uninitialized
"である。
dataTransfer.items
ドラッグデータとともに、DataTransferItemList
オブジェクトを返す。
dataTransfer.setDragImage(element, x, y)
以前に指定されたフィードバックを置換し、ドラッグフィードバックを更新するために指定された要素を使用する。
dataTransfer.types
dragstart
イベントで設定されたフォーマットを列挙する凍結された配列を返す。さらに、任意のファイルがドラッグされている場合、型の1つは文字列"Files
"となる。
data = dataTransfer.getData(format)
指定されたデータを返す。そのようなデータが存在しない場合、空の文字列を返す。
dataTransfer.setData(format, data)
指定されたデータを追加する。
dataTransfer.clearData([ format ])
指定したフォーマットのデータを削除する。引数が省略された場合、すべてのデータを削除する。
dataTransfer.files
もしあれば、ドラッグされているファイルのFileList
を返す。
ドラッグアンドドロップイベントの一部として作成されるDataTransfer
オブジェクトは、そのイベントが発生している間のみ有効である。
DataTransferItemList
インターフェイスSupport in all current engines.
各DataTransfer
オブジェクトはDataTransferItemList
オブジェクトに関連付けられる。
items.length
ドラッグデータストア内のアイテムの数を返す。
items[index]
ドラッグデータストア内のindex番目のエントリーを表すDataTransferItem
オブジェクトを返す。
items.remove(index)
ドラッグデータストア内のindex番目のエントリーを削除する。
items.clear()
ドラッグデータストア内のすべてのエントリーを削除する。
items.add(data)
items.add(data, type)
ドラッグデータストアに指定されたデータに対する新しいエントリーを追加する。データがプレーンテキストである場合、type文字列も提供される必要がある。
DataTransferItem
インターフェイスSupport in all current engines.
各DataTransferItem
オブジェクトはDataTransfer
オブジェクトに関連付けられる。
item.kind
ドラッグデータ項目の種類、"string"、"file"のいずれかを返す。
item.type
ドラッグデータ項目型文字列を返す。
item.getAsString(callback)
ドラッグデータ項目の種類がtext.である場合、引数として文字列データをもつコールバックを呼び出す。
file = item.getAsFile()
ドラッグデータアイテムの種類がFileである場合、File
オブジェクトを返す。
DragEvent
インターフェイスSupport in all current engines.
Support in all current engines.
ドラッグアンドドロップ処理モデルは、複数のイベントを含む。これらはすべてDragEvent
インターフェイスを使用する。
event.dataTransfer
イベントのDataTransfer
オブジェクトを返す。
他のイベントインターフェイスとの整合性を保つため、DragEvent
インターフェイスはコンストラクターを持つけれども、特に有用ではない。DataTransfer
オブジェクトは、ドラッグアンドドロップの間にブラウザーによって調整される処理およびセキュリティモデルを持つので、特に、スクリプトから有用なDataTransfer
オブジェクトを作成する方法はない。
次のイベントは、ドラッグアンドドロップモデルに関与する。
イベント名 | ターゲット | 取消可能か? | ドラッグデータストアモード | dropEffect | デフォルトの動作 |
---|---|---|---|---|---|
dragstart Support in all current engines. Firefox9+Safari3.1+Chrome1+ Opera12+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | ソースノード | ✓取消可能 | 読み書きモード | "none " | ドラッグアンドドロップ操作を開始する |
drag Support in all current engines. Firefox9+Safari3.1+Chrome1+ Opera12+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | ソースノード | ✓取消可能 | 保護モード | "none " | ドラッグアンドドロップ操作を続行する |
dragenter Support in all current engines. Firefox9+Safari3.1+Chrome1+ Opera12+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | 即時ユーザー選択またはbody要素 | ✓取消可能 | 保護モード | effectAllowed 値をベースにする | 潜在的なターゲット要素として即時ユーザー選択を拒絶する |
dragleave Support in all current engines. Firefox9+Safari3.1+Chrome1+ Opera12+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | 前のターゲット要素 | — | 保護モード | "none " | なし |
dragover Support in all current engines. Firefox9+Safari3.1+Chrome1+ Opera12+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | 現在のターゲット要素 | ✓取消可能 | 保護モード | effectAllowed 値をベースにする | "none"に現在のドラッグ操作リセットする |
drop Support in all current engines. Firefox9+Safari3.1+Chrome1+ Opera12+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | 現在のターゲット要素 | ✓取消可能 | 読み取り専用モード | 現在のドラッグ操作 | 変化する |
dragend Support in all current engines. Firefox9+Safari3.1+Chrome1+ Opera12+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+ | ソースノード | — | 保護モード | 現在のドラッグ操作 | 変化する |
これらのイベントバブルのすべては、構成され、effectAllowed
属性は常に、dragstart
イベント後に持っていた値を持ち、dragstart
イベントで"uninitialized
"をデフォルトとする。
draggable
属性Support in all current engines.
すべてのHTML要素はdraggable
コンテンツ属性設定を持ってもよい。draggable
属性は、次のキーワードと状態を持つ列挙属性
である:
キーワード | 状態 | 概要 |
---|---|---|
true | true | 要素はドラッグ可能になる。 |
false | false | 要素はドラッグ可能にならない。 |
この属性の欠損値のデフォルトと不正値のデフォルトは両方ともauto状態である。auto状態はユーザーエージェントのデフォルト動作を使用する。
draggable
属性を持つ要素はまた、非視覚的な相互作用の目的のために要素を名付けるtitle
属性を持つべきである。
element.draggable [ = value ]
要素がドラッグ可能である場合にtrueを返す。そうでなければfalseを返す。
デフォルトを上書きしdraggable
コンテンツの属性を設定するための、設定が可能である。