javascript - 检测触摸设备上的向左/向右滑动,但允许向上/向下滚动

标签 javascript jquery touch swipe

我需要检测左/右滑动并使用react,但希望用户能够在同一元素上滚动,因此只要他仅向左/向右移动手指,并进行最大的上/下移动X像素时,它不应该滚动,但是当他超过X时,它应该滚动。

所以我所做的是:

var startX, startY, $this = $(this);
function touchmove(event) {
        var touches = event.originalEvent.touches;
        if (touches && touches.length) {
            var deltaX = touches[0].pageX - startX;
            var deltaY = touches[0].pageY - startY;
            if (Math.abs(deltaY) > 50) {
                $this.html('X: ' + deltaX + '<br> Y: ' + deltaY + '<br>TRUE');
                $this.unbind('touchmove', touchmove);
                return true;
            } else {
                $this.html('X: ' + deltaX + '<br> Y: ' + deltaY);
                event.preventDefault();
            }
        }
    }

    function touchstart(event) {
        var touches = event.originalEvent.touches;
        if (touches && touches.length) {
            startX = touches[0].pageX;
            startY = touches[0].pageY;
            $this.bind('touchmove', touchmove);
        }
        //event.preventDefault();
    }

但我没有恢复在“if”情况下滚动的能力...

感谢您的任何提示。

最佳答案

我编写了自己的触摸处理程序事件。也许这对您有帮助

它检查:

快速点击:“fc”

向左滑动:'swl'

向右滑动:'swr'

向上滑动:'swu'

向下滑动:“swd”

每个检查都会初始化其对应的事件。但是您可以滚动并执行您通常执行的任何其他操作。你刚刚发生了一些新事件。

你需要swl swr,我也建议使用fc(fastclick)来处理点击事件...它比普通点击快得多。

window.onload = function() {
    (function(d) {
        var
            ce = function(e, n) {
                var a = document.createEvent("CustomEvent");
                a.initCustomEvent(n, true, true, e.target);
                e.target.dispatchEvent(a);
                a = null;
                return false
            },
            nm = true,
            sp = {
                x: 0,
                y: 0
            },
            ep = {
                x: 0,
                y: 0
            },
            touch = {
                touchstart: function(e) {
                    sp = {
                        x: e.touches[0].pageX,
                        y: e.touches[0].pageY
                    }
                },
                touchmove: function(e) {
                    nm = false;
                    ep = {
                        x: e.touches[0].pageX,
                        y: e.touches[0].pageY
                    }
                },
                touchend: function(e) {
                    if (nm) {
                        ce(e, 'fc')
                    } else {
                        var x = ep.x - sp.x,
                            xr = Math.abs(x),
                            y = ep.y - sp.y,
                            yr = Math.abs(y);
                        if (Math.max(xr, yr) > 20) {
                            ce(e, (xr > yr ? (x < 0 ? 'swl' : 'swr') : (y < 0 ? 'swu' : 'swd')))
                        }
                    };
                    nm = true
                },
                touchcancel: function(e) {
                    nm = false
                }
            };
        for (var a in touch) {
            d.addEventListener(a, touch[a], false);
        }
    })(document);
    //EXAMPLE OF USE
    var h = function(e) {
        console.log(e.type, e)
    };
    document.body.addEventListener('fc', h, false); // 0-50ms vs 500ms with normal click
    document.body.addEventListener('swl', h, false);
    document.body.addEventListener('swr', h, false);
    document.body.addEventListener('swu', h, false);
    document.body.addEventListener('swd', h, false);
}

在本例中,h 是每种类型事件的处理程序,我将处理程序添加到正文中。

根据我对你问题的理解,你只需要写

YOURELEMENT.addEventListener('swr',YOURSWIPERIGHTFUNCTION,false);
YOURELEMENT.addEventListener('swl',YOURSWIPELEFTFUNCTION,false);

要处理多个元素和相同的功能...只需添加一个处理程序。

如果你有

<ul id="ul"><li>1</li><li>2</li><li>3</li></ul>

你会:

var deleteli=function(e){
    var li=e.target;
    console.log('deleting '+li.textContent);
}
document.getElementById('ul').addEventListener('swl',deleteli,false);

fc 和 swr 相同

ios 中有一个 bug:不要使用alert() ..它会执行 2 次。

关于javascript - 检测触摸设备上的向左/向右滑动,但允许向上/向下滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17567344/

相关文章:

javascript - 检查对象在 JavaScript 列表中是否存在的最快方法

javascript - 使菜单打开时标题内容消失

php - jquery slider : next button, 上一个按钮和分页对象在滑动时显示两次

javascript - Jquery 从列表中删除元素

ios - UIButton 的 Touch Drag/Exit 命中区域的大小有什么问题?

javascript - 使用特定语法对 Controller 进行单元测试

javascript - mirth搜索文字需要重启服务器

javascript - 在回调函数中访问变量……什么?

android - 如何检测屏幕上的非人为触摸

Android:将触摸事件委托(delegate)给底层 View