博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
click事件触发也有失灵的时候?
阅读量:6948 次
发布时间:2019-06-27

本文共 1302 字,大约阅读时间需要 4 分钟。

hot3.png

今天做了个手机页面,点击某个按钮->弹出菜单,再点击菜单以外的任意位置->关闭菜单,在其他浏览器里面没有问题,但是在IOS浏览器中并不会关闭。

网上解决这个bug的帖子很多,这篇帖子主要是讲原理,这里写个简单的代码,大家可以复制到自己页面中去实验:

链接
div或span等

上面这段代码在其他浏览器里面没有问题,在IOS的浏览器中,点击链接和按钮都会有弹窗,但是点击其他区域却没有。

原因是因为IOS浏览器的按钮和链接才响应click事件,其他标签不响应,所以点击链接和按钮之外的其他地方并不会把click事件冒泡到body上。

我们做一个比喻来理解这个事件是怎么运作的:

屏幕被点击后,系统会发送一个事件公告(click),链接和按钮收到这个公告后会处理相应的行为(比如打开个新页面,提交表单,用户绑定的其他行为)

window、document、body、div并不会搭理这个公告,跟没看到似的,自然也就没有弹窗出现
body只接受内部的冒泡事件,点击按钮后触发了按钮的click事件,然后按钮会告诉自己的上级(body):老大,我被点击了,
body会说:好的,我会处理的,这时候弹窗就出来了。
body里面的div,span等标签默认是不会理睬click事件公告的,但是我们可以开启他,开启后他们就跟按钮一样,可以接受click事件,并汇报给上级。
开启方法:给标签绑定一个任意事件↓

1.HTML标签中添加事件属性

div或span等
div或span等
div或span等

 2.用js或者jquery绑定一个事件

$("body div").bind("click",function(){})

所以最后我们的弹出菜单可以这样写

/*给body里面的任意元素绑定事件,让这些标签能接受click事件*/$("body>*").bind("click",function(){});$("#button").bind("click",function(e){/*给按钮绑定点击事件*/    $("#menu").show();//按钮点击后显示菜单        $("body").one("click",function(){/*菜单显示后:给body绑定点击事件,执行一次后自动删除这个绑定*/        $("#menu").hide();//body收到click事件后关闭菜单    });    e.stopPropagation();//停止冒泡,按钮被点击后不告诉body,因为click事件如果冒泡到body会关闭菜单。})$("#menu").bind("click",function(e){/*给菜单绑定点击事件*/   e.stopPropagation();//停止冒泡,菜单被点击后不告诉body,不然菜单要被关闭})

 

转载于:https://my.oschina.net/feanlau/blog/994652

你可能感兴趣的文章
oracle存储过程获取异常信息码和异常信息
查看>>
大系统小做培训总结
查看>>
javascript闭包与函数式编程
查看>>
基于ceph-rbd的文件共享
查看>>
Web Service 那点事儿(3)—— SOAP 及其安全控制
查看>>
自定义按钮
查看>>
Android手机摄像头作为PC摄像头开发
查看>>
Docker
查看>>
JPush Android 推送如何区分开发、生产环境
查看>>
Redis入门
查看>>
Spring下管理sessionFactory
查看>>
CentOS系统安装MySQL支持远程连接的方法
查看>>
python爱好者QQ群
查看>>
设计模式概念总结
查看>>
mysql根据查询结果更新
查看>>
第二十三讲:tapestry的Delegate和Blocks组件
查看>>
No subject alternative names present的原因
查看>>
分享给和我一样 第一次用git的同学
查看>>
Linux(二)基本使用篇:进入目录,创建文件,编辑文件等
查看>>
利用ClipDrawable实现ImageView展开收缩
查看>>