美文网首页
js 监听移动端上下左右滑动

js 监听移动端上下左右滑动

作者: R_X | 来源:发表于2018-09-10 14:28 被阅读0次

原文:https://www.jianshu.com/p/84e995404b96

export default {
    addHandler: function (element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent) {
            element.attachEvent('on' + type, handler);
        } else {
            element['on' + type] = handler;
        }
    },
    removeHandler: function (element, type, handler) {
        if (element.removeEventListener) {
            element.removeEventListener(type, handler, false);
        } else if (element.detachEvent) {
            element.detachEvent('on' + type, handler);
        } else {
            element['on' + type] = handler;
        }
    },
    /**
     * 监听触摸的方向
     * @param target            要绑定监听的目标元素
     * @param isPreventDefault  是否屏蔽掉触摸滑动的默认行为(例如页面的上下滚动,缩放等)
     * @param upCallback        向上滑动的监听回调(若不关心,可以不传,或传false)
     * @param rightCallback     向右滑动的监听回调(若不关心,可以不传,或传false)
     * @param downCallback      向下滑动的监听回调(若不关心,可以不传,或传false)
     * @param leftCallback      向左滑动的监听回调(若不关心,可以不传,或传false)
     */
    listenTouchDirection: function (target, isPreventDefault, upCallback, rightCallback, downCallback, leftCallback) {
        var startX;
        var startY;
        function handleTouchEvent (event) {
            switch (event.type) {
                case 'touchstart':
                    startX = event.touches[0].pageX;
                    startY = event.touches[0].pageY;
                    break;
                case 'touchend':
                    var spanX = event.changedTouches[0].pageX - startX;
                    var spanY = event.changedTouches[0].pageY - startY;
                    if (Math.abs(spanX) > Math.abs(spanY)) { // 认定为水平方向滑动
                        if (spanX > 30) {         // 向右
                            if (rightCallback) {
                                rightCallback();
                            }
                        } else if (spanX < -30) { // 向左
                            if (leftCallback) {
                                leftCallback();
                            }
                        }
                    } else {  // 认定为垂直方向滑动
                        if (spanY > 30) {         // 向下
                            if (downCallback) {
                                downCallback();
                            }
                        } else if (spanY < -30) { // 向上
                            if (upCallback) {
                                upCallback();
                            }
                        }
                    }
                    break;
                case 'touchmove':
                    // 阻止默认行为
                    if (isPreventDefault) {
                        event.preventDefault();
                    }
                    break;
                default:
                    break;
            }
        }
        this.addHandler(target, 'touchstart', handleTouchEvent);
        this.addHandler(target, 'touchend', handleTouchEvent);
        this.addHandler(target, 'touchmove', handleTouchEvent);
    }
};

## 调用方式
//使用的时候很简单,只需要向下面这样调用即可
//其中下面监听的是整个DOM
//up, right, down, left为四个回调函数,分别处理上下左右的滑动事件
EventUtil.listenTouchDirection(document, true, up, right, down, left)

相关文章

网友评论

      本文标题:js 监听移动端上下左右滑动

      本文链接:https://www.haomeiwen.com/subject/hhssgftx.html