美文网首页
移动端touch事件代替click事件

移动端touch事件代替click事件

作者: 飞鱼YE | 来源:发表于2018-02-07 21:04 被阅读0次

最近有做到移动端的项目(主要是微信端),开发中遇到iPhone手机 click 事件有 300ms 延迟,尝试使用fastclick.js解决,但效果并不理想,测试发现触摸不灵敏,几乎需要点击两次才能有一次触发成功,暂未找到原因。


使用touch事件代替click事件

一个微信端的付款界面小栗子
    var keyboard = document.querySelector('.keyboard'); //键盘
    var amount = document.getElementById('amount'); //金额
    var payBtn = document.getElementById('confirm'); //支付按钮
    var keyTimer;   //长按计时
    var keyFlag;    //是否触发按键
    var startX, startY; //开始触摸的坐标

    //给键盘绑定touch事件(解决click延迟问题)
    keyboard.addEventListener('touchstart', function (e) {
        if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {  //移动端判断是否是iOS平台浏览器
            e.preventDefault();  //见注解:1.
        }

        var action = e.target.getAttribute('data-action');  //按键类型

        startX = e.touches[0].clientX;
        startY = e.touches[0].clientY;

        keyFlag = true;

        keyTimer = setTimeout(function () { //阻止长按触发输入
            keyFlag = false;

            if (amount.innerHTML && action === 'del') { //长按删除
                //执行清空的操作...
            }
        }, 500);
    });
    keyboard.addEventListener('touchmove', function (e) {    //阻止滑动触发输入(增加滑动触发范围)
        var x = Math.abs(startX - e.touches[0].clientX) >= 30;
        var y = Math.abs(startY - e.touches[0].clientY) >= 30;
        if (x && y) {  //见注解:2.
            clearTimeout(keyTimer);
            keyFlag = false;
        }
    });
    keyboard.addEventListener('touchend', function (e) {    //触发输入
        clearTimeout(keyTimer);

        if (keyFlag) {
            //执行输入金额的操作...
        }
    });

注解:

  1. 改用touch事件后发现iPhone手机触摸不灵敏,预测是触发了webview拖动的影响,所以touchstart时添加preventDefault阻止元素的默认行为,但添加后却造成安卓手机触摸不灵敏(暂未找到原因),故而判断浏览器平台类型,如果是iOS系统便阻止元素的默认行为。

  2. 在touchmove事件阶段阻止触发按键,轻微的滑动都会导致输入时没反应、漏输;解决方案:增加滑动触发范围(滑动距离在30*30以内),水平或垂直方向滑动距离大于等于30便阻止触发按键。

相关文章

  • 移动端touch事件和click事件的区别

    参考移动端touch事件和click事件的区别在手持设备上使用 touchstart 事件代替 click 事件是...

  • 移动端touch事件代替click事件

    最近有做到移动端的项目(主要是微信端),开发中遇到iPhone手机 click 事件有 300ms 延迟,尝试使用...

  • 移动端touch事件和click事件的区别

    1.touch事件以下是四种touch事件 2.touch事件和click事件的区别 在移动端,手指点击一个元素,...

  • Web移动端优化

    1、使用 touchstart 代替 click 由于移动端屏幕的设计, touchstart 事件和 click...

  • 移动端开发小结

    前言 会了PC端开发就会了移动端开发,这个说法没错,只是点击(click)事件变成了触屏事件(touch),滑轮滚...

  • e.preventDefault的失效

    在tap事件下,e.preventDefault不起效,click可以生效. 如果一定要在移动端绑定touch事件...

  • Chrome书签清理计划(Day 2)

    从笨拙的点击开始,因双手的翻腾精彩。 移动端touch与click Part 1 触发机制 click单点触发事件...

  • 2018-01-23

    移动端事件 一、事件定义及分类 1. click事件 单击事件,类似于PC端的click,但在移动端中,连续cli...

  • vue移动端绑定@click事件失效问题

    vue移动端绑定click事件失效问题原因可能是你使用了better-scroll,默认它会阻止touch事件。所...

  • 移动端点击穿透问题

    0x1 问题来源 移动端的click事件大约有300ms的延迟,绑定的touch事件触发后可能会继续触发click...

网友评论

      本文标题:移动端touch事件代替click事件

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