メインコンテンツへ移動

HTML5 タッチイベント

無料2015-03-30#HTML#触摸事件#touch#HTML5

HTML5 はモバイル端末向けの特殊なイベント(タッチイベントなど)をサポートしており、モバイルデバイスではこれらのイベントは従来のイベントよりも効率的です

一。なぜタッチイベントを使うのか?##

タッチイベントはモバイルブラウザに特有の HTML5 イベントですが、もちろんこれだけがタッチイベントを使う主な理由ではありません。モバイル端末では click に大きな遅延(約 300ms)があるためです。300ms の遅延はダブルクリックとロングタップを判断するために生じます。後続の動作がないことが確定して初めて click イベントが発火されるため、デフォルトの待機時間を経る必要があります。一方、タッチイベントの遅延は非常に短く、タッチイベントを使用することでページの応答速度を向上させ、より良いユーザーエクスペリエンスをもたらします。

二。標準的なタッチイベント##

Webkit 内のタッチイベント
イベント名説明touches 配列を含む
touchstartタッチ開始(ユーザーが画面に指を置く)はい
touchmove接触点変更(ユーザーが画面で指を移動させ、指が画面から離れない)はい
touchendタッチ終了(ユーザーの指が画面から離れる)はい
touchcancelタッチキャンセル(通知など、何��かの事情でタッチが中断された)いいえ

P.S. touches 配列はタッチオブジェクトの配列で、タッチオブジェクトには私たちが求めるデータが含まれています

タッチオブジェクトのプロパティ
プロパティ説明
identifierこのタッチの一意の識別子。ユーザーの指が画面上に留まっている限り、この値は変化しません
screenX画面左端からの接触点の距離
screenY画面上端からの接触点の距離
clientXブラウザウィンドウ左端からの接触点の距離
clientYブラウザウィンドウ上端からの接触点の距離
pageXページ左端からの接触点の距離
pageYページ上端からの接触点の距離
targetイベントソースを取得。event.target に類似

P.S. 実は radiusX/radiusY、rotationAngle、force という 3 つのプロパティもありますが、ブラウザ間の互換性が低く実装に差異があるため、ここでは紹介しません

三.IE10 のタッチイベント##

IE ポインターイベント
イベント名説明(タッチデバイス上)
MSPointerDownタッチ開始
MSPointerMove接触点移動
MSPointerUpタッチ終了
MSPointerOverタッチポイントが要素内へ移動。mouseover に相当
MSPointerOutタッチポイントが要素から離れる。mouseout に相当

P.S. IE ではポインターイベントと呼びます。このイベントには 3 つのトリガー形式(マウスクリック、スタイラスペン軽触、指タッチ)があるためです

MSPointerEvent プロパティ
プロパティ説明
hwTimestampイベント作成時のタイムスタンプ(ms)
isPrimaryこのポインターが主ポインターかどうかを示す
pointerIdポインターの一意 ID(タッチイベントの識別子に類似)
pointerType整数値。このイベントがマウス、スタイラスペン、指のいずれから発生したかを示す
pressureペンの圧力。0-255。スタイラスペン入力時のみ利用可能
rotation0-359 の整数。カーソルの回転角度(サポートされている場合)
tiltX/tiltYスタイラスペンの傾斜角度。スタイラスペン入力時のみサポート

pointerType の検出:

function handleEvent(event){
  switch(event.pointerType){
    case event.MSPOINTER_TYPE_TOUCH:
  //指
  break;
case event.MSPOINTER_TYPE_PEN:
  //スタイラスペン
  break;
case event.MSPOINTER_TYPE_MOUSE:
  //マウス
  break;
 default:
   break;
  }
}
document.body.addEventListener("MSPointerDown", handleEvent, false);

実はもっと簡単な指の検出方法があります。touches 配列が存在するかどうかを直接判断します。例えば:

document.addEventListener('MSPointerDown', function(e){
  switch(e.type){
    case 'touchstart':var startPos = e.touches ? e.touches[0].pageX : e.screenX;
    //...
  }
}, false);

四。tap イベントのソースコードをカプセル化(tap はモバイル版の click)##

(function(){

    var TOUCHSTART, TOUCHEND;

    //normal touch events
    if (typeof(window.ontouchstart) != 'undefined') {
    
        TOUCHSTART = 'touchstart';
        TOUCHEND   = 'touchend';
    
    //microsoft touch events
    } else if (typeof(window.onmspointerdown) != 'undefined') {
        TOUCHSTART = 'MSPointerDown';
        TOUCHEND   = 'MSPointerUp';
    } else {
        TOUCHSTART = 'mousedown';
        TOUCHEND   = 'mouseup';
    }


    function NodeFacade(node){
    
        this._node = node;
    
    }

    NodeFacade.prototype.getDomNode = function() {
        return this._node;
    }

    NodeFacade.prototype.on = function(evt, callback, scope) {
    
        var scopeObj;
    
        if(!scope) {
            scopeObj = this._node;
        } else{
            scopeObj = scope;
        }

    
        if (evt === 'tap') {
            this._node.addEventListener(TOUCHSTART, function() {
                callback.apply(scope, arguments);
            });
        } else if (evt === 'tapend') {
            this._node.addEventListener(TOUCHEND, function() {
                callback.apply(scope, arguments);
            });
        } else {
            this._node.addEventListener(evt, function() {
                callback.apply(scope, arguments);
            });
        }
    
        return this;
    
    }

    window.$ = function(selector) {

        var node = document.querySelector(selector);

        if(node) {
            return new NodeFacade(node);
        } else {
            return null;
        }
    }


})();

P.S. 上記ソースコードは touch-interfaces.com より

参考資料###

  • 『HTML5 タッチインターフェース設計と開発』

コメント

コメントはまだありません

コメントを書く