zoukankan      html  css  js  c++  java
  • Zepto tap 穿透bug、解决移动端点击穿透问题

    当两个层重叠在一起时,或是有个弹窗,使用Zepto的tap事件时,点击上面的一层时会触发下面一层的事件,特别是底层如果是input框时,必“穿 透”,

    现象原因:

    zepto的tap通过兼听绑定在document上的touch事件来完成tap事件的模拟的,及tap事件是冒泡到document上触发的

    再点击完成时的tap事件(touchstart ouchend)需要冒泡到document上才会触发,而在冒泡到document之前,用 户手的接触屏幕(touchstart)和离开屏幕(touchend)是会触发click事件的,因为click事件有延迟触发(这就是为什么移动端不 用click而用tap的原因)(大概是300ms,为了实现safari的双击事件的设计),所以在执行完tap事件之后,弹出来的选择组件马 上就隐藏了,此时click事件还在延迟的300ms之中,当300ms到来的时候,click到的其实不是完成而是隐藏之后的下方的元素,如果正下方的 元素绑定的有click事件此时便会触发,如果没有绑定click事件的话就当没click,但是正下方的是input输入框(或者select选择框或 者单选复选框),点击默认聚焦而弹出输入键盘,也就出现了上面的点透现象。

    解决方法如下:

    1、使用github上有一个叫做fastclick的库;

    2、监听touchend事件,并在事件中使用preventDefault()阻止冒泡;

    $(".js-egg-close").on("touchend", function(e){  //这里使用touchstart事件也是可以的,
        e.preventDefault();
         $('.sec_dlg_eggs').remove();
         $(".eggs_bg").remove();
    });

    3、使用CSS3的pointer-events=true,pointer-events=none切换来实现;

    4.延迟一定的时间来处理事件。本人测试是超过320毫秒就不会出现穿透,与jQuery的动画(fadeIn(),fadeOut())等配合,个人感觉良好;

    5.如果还不奏效,终极解决方案是用click提代tap;

    设置点击事件为_tap

    _tap = touchend in document ? "touchend":"click"

    这样在执行的过程中就可以直接调用div.on(_tap, function(){}) 

    若有恒,何须三更睡五更起;最无益,莫过于一日曝十日寒
  • 相关阅读:
    Trie
    [转]Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
    [Bzoj2242]常见数值算法
    JavaScript百炼成仙(记录笔记)
    tcpreplay重放报文,tcpdump能抓到包,应用程序收不到包
    用jquery tools来实现选项卡
    ExtNet第二篇
    线性表最简单的表示
    c语言中线性表基本操作方法
    ExtNet第一篇
  • 原文地址:https://www.cnblogs.com/21haoxingxiu/p/7253624.html
Copyright © 2011-2022 走看看