LoginSignup
2
3

More than 5 years have passed since last update.

touchmove時は発火しないカスタムイベント

Last updated at Posted at 2016-09-14

仕様

SPとタブレット時の話です。
touchstartやtouchendでイベントを定義していると、スクロール時にもイベントが走ってしまう。
これを予防して、タップの時のみイベントが走るようにしたい。

カスタムイベントを作成

js
//es6を一部使っているのでbabel通さないと動かないです
var compare_y = (evt) => {
    var touchObj,
        touchstartY,
        touchendY;
    document.addEventListener('touchstart', (e) => {
        touchObj = e.changedTouches[0] ;
        touchstartY = touchObj.pageY ;// Y座標
    });
    document.addEventListener('touchend', (e) => {
        touchObj = e.changedTouches[0] ;
        touchendY = touchObj.pageY ;// Y座標
        if(touchstartY == touchendY) {
            //touchstartのY座標とtouchendのY座標が同一だった場合、カスタムイベントを発火させる
            e.target.dispatchEvent(evt);
        }
    });
};
var touchDecision = () => {
    //uaはuseragent判定用のjsをreqireしてます
    if (!ua.Mobile && !ua.Tablet) return;
    //tapと言うカスタムイベントを作成
    var custom = new CustomEvent('tap');
    compare_y(custom);
};

これでタップの時だけに発火するカスタムイベントができました。

使うとき

js
var _touch = ('ontouchstart' in document) ? 'tap' : 'click'; //PC時はclick、SPとタブレットはtap

var func = function(){
    var $trigger = $('[data-trigger]');
    if(!$trigger.length) return;
    $trigger.on(_touch, function(){
        console.log('tap or click');
    });
};

$(function () {
    touchDecision();
    func();
});

まとめ

もっといい方法があるとは思うんですが、とりあえず自分で考えた限りだとこうなリました。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3