TIPS 064:ドラッグ&ドロップで許可される動作を指定する

TIPS 064:ドラッグ&ドロップで許可される動作を指定する

effectAllowed/dropEffectプロパティを指定することで、ドラッグ&ドロップ時に想定される動作を明示的に指定できます。これらのプロパティを指定しておくことで、ドラッグ&ドロップ時の動作を制限できるだけでなく、動作に応じてマウスポインタが変化し、視覚的にも現在の操作内容が明確になります。

[リスト06]ドラッグ&ドロップで許可される操作を指定(effect.html)

  <script>
  window.addEventListener('DOMContentLoaded', function() {
    // ドラッグ/ドロップ対象の要素を取得
    var drag = document.querySelector('#drag');
    var drop = document.querySelector('#drop');
 
    // ドラッグ開始時の処理を定義
    drag.addEventListener('dragstart', function(e) {
      // 現在の要素にコピーを許可
      e.dataTransfer.effectAllowed = 'copy';
      e.dataTransfer.setData('text', e.target.id);
    }, true);
 
    // ドラッグ中の処理を定義
    drop.addEventListener('dragover', function(e) {
      e.preventDefault();
      // ドロップ領域でコピーを許可
      e.dataTransfer.dropEffect = 'copy';
    }, true);
  
    // ドロップ時の処理を定義
    drop.addEventListener('drop', function(e) {
      var id = e.dataTransfer.getData('text');
      e.currentTarget.appendChild(document.getElementById(id));
      e.preventDefault();
    }, true);
  });
  </script>
図6:ドラッグ操作に応じてコピーアイコンを表示(クリックで拡大)
※本サンプルは、IEでは動作しません

まず、effectAllowedプロパティは、ドラッグ元要素で許可される動作を指定します。dragstartイベントリスナーで指定します(1)。以下に、指定できる主な値をまとめておきます。

表5:effectAllowedプロパティの設定値

設定値概要
noneすべてのドロップ操作を禁止
copyデータをコピー
linkデータをリンク
moveデータを移動
copyLinkデータをコピー、またはリンク
copyMoveデータをコピー、または移動
linkMoveデータをリンク、または移動
allすべての操作を許可

そして、effectAllowedプロパティとセットで指定するのがdropEffectedプロパティです(2)。こちらはドロップ先の要素で許可する動作を指定します。以下は、主な設定値です。

表6:dropEeffectプロパティの設定値

設定値概要
noneすべてのドロップ操作を禁止
copyデータをコピー
linkデータをリンク
moveデータを移動

dropEffectプロパティには、effectAllowedプロパティで指定した動作に対応する値を指定します。effectAllowed/dropEffectプロパティの値に応じて、マウスポインタも適した形状に変化する点に注目してください。

なお、dropEffectプロパティの値が、effectAllowedプロパティで許可した動作のいずれにも合致しない場合、マウスアイコンもドロップ禁止を表すものとなり、ドロップ操作はキャンセルされます。

図7:effectAllowed/dropEffectプロパティが一致しない場合(クリックで拡大)

TIPS 065:ドラッグアイコンをカスタマイズする

setDragImageメソッドを利用することで、ドラッグ時のアイコン画像を差し替えることもできます。アプリの動作によっては、独自のアイコンによって、より操作の結果を直感的に知らせることができるでしょう。

[リスト07]ドラッグ時のアイコンをカスタマイズするコード(icon.html)

  <script>
  window.addEventListener('DOMContentLoaded', function() {
    // ドラッグ/ドロップ対象の要素を取得
    var drag = document.querySelector('#drag');
    var drop = document.querySelector('#drop');
    
    // ドラッグ開始時の処理を定義
    drag.addEventListener('dragstart', function(e) {
      // アイコン画像を準備&ドラッグアイコンとして設定
      var icon = document.createElement('img');
      icon.src = 'icon.jpg';
      e.dataTransfer.setDragImage(icon, 0, 0);
      e.dataTransfer.setData('text', e.target.id);
    }, true);
    ...中略...
  });
  </script>
図8:ドラッグ時のアイコンを独自のicon.jpgで差替(クリックで拡大)
※本サンプルは、IEでは動作しません

setDragImageメソッドの引数には「ドラッグアイコン」「X座標」「Y座標」の順で指定します。ドラッグアイコンは、あらかじめImageオブジェクトとして用意しておきます。

X/Y座標は、アイコン画像をマウスポインタの位置からずらしたい場合に利用します。デフォルトでは、マウスポインタ位置にアイコン画像を表示します。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30