• IOS的Safari浏览器中,点击事件失效的原理及解决办法


    这里做了事件委托,简单区分一下【目标元素】和【代理元素】,为后续论述理解做铺垫。

    【目标元素】:实际希望点击的元素,可以是任意标签。

    【代理元素】:代替【目标元素】触发点击事件的元素,有可能是目标元素的父级元素,document,body等。

    一、现象

    当使用事件委托给【目标元素】添加 click 事件时,如果【代理元素】是 document或body,并且【目标元素】是默认不可点击的(如 div, span 等),此时click事件会失效。如果【目标元素】是可点击的(比如 button、a 标签),此时click事件还是有效的

    二、原理

    移动端页面,在做click事件委托的时候,不要委托到document上,因为不管是安卓还是IOS,document是没有click事件的,只有touch事件,而且有些标签在IOS上也是没有click事件的。

    三、解决办法有3种

    1、【代理元素】可以是【目标元素】的父级元素,document,body等,但【目标元素】必须为a或者button可点击的标签。

    尽量使用touch事件或者tap事件,如果你需要click事件的延迟效果来达到某些交互,尽量把click事件绑定在a或者button可点击的标签上。

    2、【代理元素】必须是【目标元素】的非document,body父级元素,【目标元素】可以是任意标签。

    click事件委托到非document或body的父级元素上。

    3、【代理元素】可以是【目标元素】的父级元素,document,body等,【目标元素】可以是任意标签,但是要设置cursor: pointer;。

    出现上述点击事件失效的问题,让我们不得不体会到标签语义化的重要性,于是这里建议大家写代码时,【目标元素】多用a或者button可点击的标签,【代理元素】多用非document,body父级元素。

  • 相关阅读:
    初步掌握Yarn的架构及原理(转)
    CORS 专题
    WebSocket是一种协议
    InputStream中read()与read(byte[] b)(转)
    listview异步加载sd卡图片
    ListView getView中放置多个item和getItemViewType的用法
    Android ListView异步加载数据
    android sqlite 一次创建多个表
    Android Adapter的getViewTypeCount和getItemViewType
    Android 获取SDCard上图片和视频的缩略图
  • 原文地址:https://www.cnblogs.com/camille666/p/ios_safari_click_disabled.html
Copyright © 2020-2023  润新知