最近要在一个移动端页面上新增一个下拉列表,点击下拉,而后点击页面任何位置列表收回,这个功能很简单,在PC端也实现过不少次,基本思路就是在document/body上绑定click事件,触发时隐藏下拉列表。编程
开发时一切正常,在Chrome的模拟手机浏览器上测试也一切正常,可是在iOS下的Safari上测试,列表能够展开,在页面任意位置点击收回的功能却失效了。浏览器
Chrome模拟手机浏览器上一切正常,真机却有问题,在网上搜索的调试方法基本上都须要Mac(流下了贫穷的眼泪),只能一点一点修改js来调试了。测试
首先的思路就是排除其余变量,我在一个测试页面上实现了相同的下拉表单,并在document/body上绑定了click事件,而后发现一切正常。 优化
document
或body
的父级元素上。cursor: pointer
。cursor: pointer
这个样式规则后,被认为是可点击元素,也就能够触发click事件了。cursor: pointer
才能够触发click事件,其余元素都可以正常触发click事件。$(document).on('click touchstart', function() {// do something...})
。其实问题到这里就解决了(若是就这么解决我也不会写这篇文章了-_-||),可是总有个问题在我心头挥之不去,为何以前个人测试功能页面只在document绑定click就一切正常,正式页面却不行呢,两个页面明明没什么区别,这个问题不解决怎么能算是学到东西了呢。 调试
因此推论以下,iOS下的浏览器,触发document/body的click事件时,若是页面超过一屏,会认为这是网页双击向下翻页的第一次点击,这属于浏览器的默认行为,咱们本身定义的click事件就失效了。可是若是页面都没有超过一屏,这个翻页的默认行为不存在,咱们本身定义的click事件就能够执行了,大功告成~ code