ドラッグアンドドロップをもっと簡単に
uupaa.jsでは、Drag&Dropをこのように書くことができます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>minimum draggable</title> <script id="uupaa.js" src="../../uupaa.js?load=ui,drag"></script> <style>#drag { background: pink; }</style> </head> <body> <div id="drag">draggable</div> <pre>dummy text</pre> <script> uu.ready(function() { // DOMContentLoaded状態待ち var elm = uu.id("drag"); uu.event.set(elm, "mousedown", F); // アタッチ uu.ui.element.toAbsolute(elm); // elmを絶対座標化 function F(evt) { uu.event.stop(evt); // デフォルト動作を抑止 + イベントのバブルアップを停止 switch (uu.event.type(evt)) { // イベントタイプのクロスブラウザ化(すり合わせ) case "mousemove": uu.module.drag.move(elm, evt); break; // 移動 case "mousedown": uu.module.drag.save(elm, evt); // 開始 case "mouseup": uu.event.toggle(F, uu.ua.ie ? elm : document, "mousemove,mouseup", true); // 終了 } } }); </script></body></html>
jQueryでゴリゴリ書くとすると、たぶんこんな感じになるんでしょうか(試してみたらSafari3とIE6で動かないみたいだけどこの場は気にしない)
<style>#drag { position: absolute; background: pink; }</style> <script> $(document).ready(function(){ var offX, offY; $("#drag").mousedown(function(event){ $(this).addClass("dragging"); offX = event.pageX - parseInt($(this).css("left")); offY = event.pageY - parseInt($(this).css("top")); $(document).mousemove(function(event){ $("div.dragging").css({ left: event.pageX - offX, top: event.pageY - offY }); event.preventDefault() }); $(document).mouseup(function(event){ $("div.dragging").unbind("mousemove").removeClass("dragging"); event.preventDefault() }); }); }); </script>
Firefox3 + Firebugのプロファイラで計測してみると、一桁動作速度が違いました。
uupaa.jsは余計なnewとかクエリーが走らないので、このようなケースでは違いがはっきりと出るようです。
出来合いのモジュール(プラグイン)を使う場合は、uupaa.jsだとこうなります。
<script id="uupaa.js" src="../../uupaa.js?load=ui,effect,drag"></script> <script> uu.ready(function() { new uu.module.drag.free(uu.id("drag")); }); </script>