Home > Javascript > [HTML5] Drag and Drop API のこと

[HTML5] Drag and Drop API のこと

HTML5のドラッグ&ドロップはこれ書いてる時点でFirefox、Chrome、IEが対応。
しかしIEの場合はFileReaderとデータURI未対応だから全く面白みがない。

Drag出来るといってもMooToolsやjQueryなどで実装するようなぬるぬる動かすようなものではなく、
html5.jpのチェックページにあるツールのように、右から左へ受け流すようなことしか出来ない。
jQueryとの比較がこのサイトで見れる。

故にshapeshed.comのデモみたく、ゴミ箱にドキュメントを捨てたり、カートに商品を入れたりする用途には向いているが
自由奔放にドラッグさせるとなるとFrameworkの力を借りるより他ない。

サンプルでよく見るのはコンピューターにあるファイルをブラウザウィンドウにドラッグして、
そのファイルの中身をFileAPIで読み込んでこねこねするっていうやつだと思う。
以下に簡単なサンプルを示す。

最小構成例

JavaScript:
  1. function FileDrop(file, el){
  2.  
  3.     if (!file) {
  4.         return;
  5.     }
  6.    
  7.     if(!file.type.match(/image\/\w+/)){
  8.         alert('画像をドロップしてください。');
  9.     }
  10.    
  11.     var img = document.createElement("img");
  12.    
  13.     var reader = new FileReader();
  14.    
  15.     reader.onload = function(e) {
  16.         img.src = e.target.result;
  17.     }
  18.    
  19.     reader.readAsDataURL(file);
  20.     el.appendChild(img);
  21. }
  22.  
  23. window.onload = function(){
  24.   var target = document.getElementById("target");
  25.   target.ondrop=function(e){
  26.     e.preventDefault();
  27.     FileDrop(e.dataTransfer.files[0],target);
  28.   };
  29.  
  30.   target.ondragover=function(e){
  31.     e.preventDefault();
  32.   };
  33.  
  34. };
HTML:
  1. <div id="target" style="height:200px;background-color:#9CF;overflow:hidden;"></div>

解説

ondropイベントから渡されたDragEventオブジェクトにはDragEvent.dataTransferがあり、
filesプロパティにファイルの情報が配列として格納されている。
その中から最初の1つをFileDrop関数に渡して処理する。

JavaScript:
  1. FileDrop(e.dataTransfer.files[0],target);

FormのPOST送信時と同じくtypeプロパティが画像のファイルタイプなので、正規表現で画像かどうか調べる。

JavaScript:
  1. if(!file.type.match(/image\/\w+/)){
  2.     alert('画像をドロップしてください。');
  3. }

img要素作っとく。

JavaScript:
  1. var img = document.createElement("img");

FileReader APIインスタンス作成。

JavaScript:
  1. var reader = new FileReader();

FileReaderのイベントハンドラ。
readAsDataURLでロードされたら画像のsrcをデータスキームに設定。

JavaScript:
  1. reader.onload = function(e) {
  2.     img.src = e.target.result;
  3. }

readAsDataURLメソッドでファイルの中身を読み込む。

JavaScript:
  1. reader.readAsDataURL(file);

画像を要素に入れて表示。

JavaScript:
  1. el.appendChild(img);

こういうことするなら確かに便利。
でもシェアの高いIEが実装してない現状ではAjax Upload使って実装するしかないし、
ドラッグドロップも既存ライブラリを使う方が手っ取り早いと思った。

参考

3つ目のサイトが物凄い詳しい。

MooToolsとの組み合わせ例

ChromeはローカルやiframeだとFileReaderが動かないらしい。Firefoxで確認できます。

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://tenderfeel.xsrv.jp/javascript/927/trackback/
Listed below are links to weblogs that reference
[HTML5] Drag and Drop API のこと from WebTecNote

Home > Javascript > [HTML5] Drag and Drop API のこと

最近の投稿
最近の修正
  • そしてこのSQLはわれながらよく書いたと思う 2010-11-15
  • CSVの列っていう方がいいのかな…118項目だった 2010-11-15
  • 楽天のCSVの項目が116個もあった衝撃 2010-11-15
  • オフィスで香水臭振りまくのは迷惑だと知れ 2010-11-15
  • ぐあー フレグランステロやー 2010-11-15
  • More updates...

Powered by Twitter Tools

Tag Cloud
おすすめサーバー・他
メタ情報

Return to page top