HTML5 ドラッグ&ドロップ

HTML5からドラッグ&ドロップAPIが登場した。 これまでjQueryを使わないとできなかったが、HTML5でもできるようになったのでさっそく使ってみた。 操作は次のHTMLで画像一覧の画像をカートに移すことを試してみた。 ドラッグ&ドロップAPIの仕様 HTML
<h2>画像一覧</h2>
<div id="goods">
</div>
<h2>カート</h2>
<div id="cart">
</div>
<form class="add">
  <input type="button" id="save" value="保存">
  <input type="button" id="restore" value="復元">
  <input type="button" id="clear" value="削除">
</form>
JavaScript
var imglist = {
 'b1':'<img id="b1" src="http://sample.com/img2/pic/photo01_thumb.jpg" draggable="true">',
 'b2':'<img id="b2" src="http://sample.com/img2/pic/photo02_thumb.jpg" draggable="true">',
 'b3':'<img id="b3" src="http://sample.com/img2/pic/photo03_thumb.jpg" draggable="true">'
};
jQuery(function($){
  var base = [];
  imginit();
  $('#save').click(save_module);
  $('#restore').click(restore_module);
  $('#clear').click(clear_module);

  /***********    画像一覧側の処理    ***************/
  // 画像一覧のdiv要素にdragenterイベントのリスナーをセット
  var goods = document.querySelector('#goods');
  goods.addEventListener("dragenter",function(event){
    // ディフォルト・アクションをキャンセル
    event.preventDefault();
  },false);
  // 画像一覧のdiv要素にdragoverイベントのリスナーをセット
  goods.addEventListener("dragover",function(event){
    // ディフォルト・アクションをキャンセル
    event.preventDefault();
  },false);
  // 画像一覧のdiv要素にdropイベントのリスナーをセット
  goods.addEventListener("drop",function(event){
    // データ転送により送られたきたデータ
    var id = event.dataTransfer.getData("text");
     // ドロップされたimg要素
    var elm = document.getElementById(id);
    goods.appendChild(elm); 
    // ディフォルト・アクションをキャンセル
    event.preventDefault(); 
  },false);

  /************    カート側の処理     ************/
  // カートのdiv要素にdragenterイベントのリスナーをセット
  var cart = document.querySelector('#cart');
  cart.addEventListener("dragenter",function(event){
    // ディフォルト・アクションをキャンセル
    event.preventDefault();
  },false);
  // カートのdiv要素にdragoverイベントのリスナーをセット
  cart.addEventListener("dragover",function(event){
    // ディフォルト・アクションをキャンセル
    event.preventDefault();
  },false);
  // カートのdiv要素にdropイベントのリスナーをセット
  cart.addEventListener("drop",function(event){
    // データ転送により送られたきたデータ
    var id = event.dataTransfer.getData("text");
     // ドロップされたimg要素
    var elm = document.getElementById(id);
    cart.appendChild(elm); 
    // ディフォルト・アクションをキャンセル
    event.preventDefault(); 
  },false); 

  function imginit(){
    /*  画像一覧に画像を追加する */
    var goodsdiv = $('#goods');
    $.each(imglist,function(idx,txt){
      var elment = $(txt);
      // jQuery要素をimg要素に変換
      dragstartlis(elment);
      // #goodsに追加する
      goodsdiv.append(elment);
    });
  }

  function dragstartlis(elment){
    // jQuery要素をDom要素に変換
    var img = elment[0];
    // img要素にdragstartイベントのリスナーをセット
    img.addEventListener("dragstart",function(event){
      // データ転送用のデータをセット
      event.dataTransfer.setData("text",event.target.id);
    },false);
  }

  function save_module(){
    // webStorageに保存
    base[0] = [];
    base[1] = [];
    var goodsimg_list = $('#goods img');
    goodsimg_list.each(function(){
      base[0].push($(this).attr('id'));
    });
    var cartimg_list = $('#cart img');
    cartimg_list.each(function(){
      base[1].push($(this).attr('id'));
    });
    localStorage.setItem("saveKey", JSON.stringify(base));
  }

  function restore_module(){
    // webStorageから復元
    var bs = localStorage.getItem("saveKey");
    if(bs){
      base = JSON.parse(bs);
      // Imageオブジェクトをdiv#goodsとdiv#cartに設定する
      var goodsid_list = base[0];
      var cartid_list = base[1];
      var goodsdiv = $('#goods');
      var cartdiv = $('#cart');
      goodsdiv.empty();
      $.each(goodsid_list,function(idx,txt){
        var elment = $(imglist[txt]);
        // jQuery要素をimg要素に変換
        dragstartlis(elment);
        // #goodsに追加する
        goodsdiv.append(elment);
      });
      cartdiv.empty();
      $.each(cartid_list,function(idx,txt){
        var elment = $(imglist[txt]);
        // jQuery要素をimg要素に変換
        dragstartlis(elment);
        // #cartに追加する
        cartdiv.append(elment);
      });
    }else{
      alert('復元データがありません');
    }
  }

  function clear_module(){
    // すべてのデータを削除する
    localStorage.clear();
  }
});
サンプル

画像一覧

カート