zoukankan      html  css  js  c++  java
  • 移动开发那些坑之——safari mobile click事件的冒泡bug

    今天在iphone6 plus的safari上测试这么一段代码:

    <script>
        $(document).on('click','.callApp', function() {
            alert("hehe");
        })
    </script>
    <div class="callApp caMiddle">打开app,马上参加活动</div>
    <a href="javascript:;" class="callApp caMiddle">打开app,马上参加活动</a>
    <img src="http://news.baidu.com/resource/img/logo_news.gif" alt="test" class="callApp">

    发现,点击<img>和<a>是可以触发事件的,但是点击<div>无效。

    1.起初,我以为是引用的zepto的问题,后来用了jquery之后,发现也是这个表现,并且,PC和Android设备都没有问题,唯独ios的safari无法触发事件。

    2.我把click事件换成touchstart之后,事件又都可以触发了。

    怪异。

    3.难道是事件代理Safari不支持?我尝试去掉代理直接注册事件,测试发现,ok了。

    4.那,我把事件代理到body下面的某一个div容器上,继续测试,发现也是ok的。

    5.难道是safari事件冒泡,没有冒到document上来?测试下面一段代码:

    document.addEventListener("click",function(e){
        alert(e.target.tagName)
    },false)

    5.果然,还是跟最开始的现象一样,点击<img>和<a>是可以触发,点击<div>无效

    6.google了一下,果然这个万恶的safari是有bug的,我英文不好,大家可以去看下这个http://www.quirksmode.org/blog/archives/2010/10/click_event_del_1.html

    解决方案

    方案1.
    添加样式body{cursor:pointer}——原因很奇葩,参见http://stackoverflow.com/questions/10165141/(推荐)
    备注:这里最好通过js动态判断是ios再加此样式;如果都加上,那Android设备会出现点击屏幕全屏出现浅蓝色或浅红色<a>触感反馈的样式遮罩。

    方案2.
    使用zepto.js的1.0rc1版本的tap事件——没有仔细看文档,经我测试V1.0-1.1.6等等这几个版本都不好使(tap有一个很傻比的地方,你摁住慢慢滚屏的时候,tap会触发,其实只是在滚屏,但是它似乎模拟click的时候没有去判断start和end的偏移范围)

    3.欢迎交流

  • 相关阅读:
    数据库简介
    计算机网络OSI七层协议
    信息论知识点(绪论)
    Wireshark抓取HTTP数据包
    配置FileZilla FTP服务器
    Redis集群搭建的几种方式
    Redis单个分片高可用&哨兵集群
    Redis哈希一致性&对应API操作
    MapReduce实现好友推荐
    window下使用IDEA远程调试伪分布式hadoop集群
  • 原文地址:https://www.cnblogs.com/youryida/p/4892912.html
Copyright © 2011-2022 走看看