タッチイベント
by nekosmash
HTML
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<div id="hoge" style="position:absolute; cursor:move; z-index:1; border:1px solid #FFF;">
<img src="http://blog.fenrir-inc.com/jp/images/fenrir_dev_blog.png" width="90" height="90">
</div>
CSS
#square{
background:black;
height:100px;
}
JavaScript
/* タッチできる環境なら true、そうでないなら false 。
ここで先に判別しておきます。 */
var isTouch = ('ontouchstart' in window);
/* hoge のイベントを jQuery.bind で捕獲します。 */
$('#hoge').bind({
/* タッチの開始、マウスボタンを押したとき */
'touchstart mousedown': function(e) {
// ページが動いたり、反応を止める
e.preventDefault();
// 開始位置 X,Y 座標を覚えておく
// (touchmove イベントを通らず終了したときのために必ず覚えておくこと)
this.pageX = (isTouch ? event.changedTouches[0].pageX : e.pageX);
this.pageY = (isTouch ? event.changedTouches[0].pageY : e.pageY);
// 現在の hoge の場所を覚えておく
this.left = $(this).position().left;
this.top = $(this).position().top;
// タッチ処理を開始したフラグをたてる
this.touched = true;
},
/* タッチしながら移動、マウスのドラッグ */
'touchmove mousemove': function(e) {
// 開始していない場合は動かないようにする
// 過剰動作の防止
if (!this.touched) {
return;
}
// ページが動くのを止める
e.preventDefault();
// 移動先の hoge の位置を取得する
this.left = this.left - (this.pageX - (isTouch ? event.changedTouches[0].pageX : e.pageX) );
this.top = this.top - (this.pageY - (isTouch ? event.changedTouches[0].pageY : e.pageY) );
// hoge を移動させる
$(this).css({left:this.left, top:this.top});
// 位置 X,Y 座標を覚えておく
this.pageX = (isTouch ? event.changedTouches[0].pageX : e.pageX);
this.pageY = (isTouch ? event.changedTouches[0].pageY : e.pageY);
},
/* タッチの終了、マウスのドラッグの終了 */
'touchend mouseup': function(e) {
if (!this.touched) {
return;
}
// タッチ処理は終了したため、フラグをたたむ
this.touched = false;
// 必要なら以下で最終の hoge の位置を取得し何かに使う
// this.pageX
// this.pageY
}
});