zoukankan      html  css  js  c++  java
  • 移动web touch事件

    参考:http://www.cnblogs.com/dojo-lzz/p/5452575.html

      wap中的原生touch 事件,touchstart、touchmove、touchend、touchcancel,这些事件仅仅在移动端才会被触发,在pc端无效。而且在web中也没有PC的鼠标事件。两个端都存在click事件,但在web下会存在以下两个问题:

    移动端click事件存在300ms延迟

      因为网页中存在一种双击放大的操作,两次点击之间不超过300ms则认为是双击,所以浏览器为了区别是双击还是单击,单击的效果会有300ms延迟。了有更好的用户体验,需要自己利用以上的4个touch事件封装一些更快的点击事件(一般由touchstart以及touchend组成)其实也可以使用第三方库如zepto,使用里面封装的tab事件。或者使用插件 fastclick。

    穿透现象

      遮罩上绑定一个touchstart事件,触发就使遮罩消失,然后300ms后触碰点下的元素的click事件会被触发。原因也还是因为以上的300ms延迟。点击300ms发生后,浏览器寻找触碰点的顶层元素,然后触发一次click事件,大致过程如下:

    e = document.elementFromPoint(x, y);
    e.dispatchEvent('click');

      以下代码会出现穿透现象

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
        <title></title>
    </head>
    <body>
    <style>
        .splash{
            position: fixed;
            width: 100%;
            height: 100%;
            background-color: rgba(99,99,99,0.2);
        }
    </style>
    <div class="splash"></div>
    <button onclick="console.log('click')">这是按钮</button>
    <script>
        let splash = document.querySelector('.splash');
        splash.addEventListener('touchend',()=>{
            splash.style.display = "none";
        })
    </script>
    </body>
    </html>

    为了解决以上两个问题,需要自己封装web的点击事件,封装的思路如下:

    • touchstart和touchend组成一次点击事件,按下和抬起之间所移动的距离不得超过4px
    • 在捕获阶段,对click事件进行事件流拦截
  • 相关阅读:
    无法远程连接mssqlserver2005服务器的解决
    can't init script for
    为什么要分层?
    如何判断控件是否已加载完成
    社团管理_第4组_需求分析报告
    FSF
    【转载】(翻译)反射的第二部分:Emit
    【转载】Emit学习基础篇基本概念介绍
    白话C#
    GCC
  • 原文地址:https://www.cnblogs.com/hellohello/p/7847488.html
Copyright © 2011-2022 走看看