记录自己在移动端H5开发中的一些坑。
移动端click事件延迟
移动端的click事件都会有300ms的延迟,是因为浏览器在等待你是否执行双击,但此延迟导致用户体验不好。
除此之外还会发生点击穿透的问题,例如:点击蒙层(mask)上的关闭按钮,蒙层消失后发现触发了按钮下面元素的click事件。
原因:蒙层关闭按钮绑定的是touch事件,而按钮下边元素绑定的是click事件,touch事件触发之后,蒙层消失了,300ms后这个点的click事件触发,event的target自然就是按钮下面的元素。
解决方案:
- 尽量都使用touch事件来替换click事件,例如用touchend事件(推荐)
- 用script标签引入fastclick库去除延迟。
- zepto的touch模块,tap事件也是可以解决在click的延迟问题。
- 延迟一定的时间(300ms+)来处理事件(不推荐)。
- 触摸事件的响应顺序为touchstart—>touchmove—>touchend—>click,也可以通过绑定ontouchstart事件,加快对事件的响应,解决300ms延迟问题。
iOS点击事件失效
当使用委托给一个元素添加click
事件时,如果事件是委托到 document
或 body
上,并且委托的元素是默认不可点击的(如 div
, span
等),此时 click
事件会失效。
解决办法有 4 种可供选择:
- 将
click
事件直接绑定到目标元素(即.target
)上 - 将目标元素换成
<a>
或者button
等可点击的元素 - 将
click
事件委托到非document
或body
的父级元素上 - 给目标元素加一条样式规则
cursor: pointer;
推荐后两种。从解决办法来看,推测在 safari 中,不可点击的元素的点击事件不会冒泡到父级元素。通过添加 cursor: pointer
使得元素变成了可点击的了。
iOS input验证码自动填充重复
在iOS12的某些机型上,当收到验证码,自动填充input框的时候,会出现两次填充的情况,如下图:
解决办法:
- 限制input框输入长度
// 限制验证长度 防止ios12以上的版本出现验证码自动填充重复
if (verifyCode.length > 6) {
verifyCode = verifyCode.slice(0, 6);
$("#J_verify_code").val(verifyCode);
}
iOS对Date()的支持不一样
直接上代码
// ios safari
+new Date("2019-01-22 00:00:00") + // NaN
new Date("2019/01/22 00:00:00") + // 1548086400000
// chrome
new Date("2019-01-22 00:00:00") + // 1548086400000
new Date("2019/01/22 00:00:00"); // 1548086400000
可以看出ios的Date是不支持用 YYYY-MM-DD的格式来解析时间的。
解决方案:尽量使用时间戳的形式来解析时间,或者使用/的形式。