美文网首页
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