Skip to content

移动端H5踩坑合集

Published:

记录自己在移动端H5开发中的一些坑。

移动端click事件延迟

移动端的click事件都会有300ms的延迟,是因为浏览器在等待你是否执行双击,但此延迟导致用户体验不好。

除此之外还会发生点击穿透的问题,例如:点击蒙层(mask)上的关闭按钮,蒙层消失后发现触发了按钮下面元素的click事件。

原因:蒙层关闭按钮绑定的是touch事件,而按钮下边元素绑定的是click事件,touch事件触发之后,蒙层消失了,300ms后这个点的click事件触发,event的target自然就是按钮下面的元素。

解决方案:

iOS点击事件失效

当使用委托给一个元素添加click事件时,如果事件是委托到 documentbody 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效。

解决办法有 4 种可供选择:

  1. click 事件直接绑定到目标元素(即 .target)上
  2. 将目标元素换成 <a> 或者 button 等可点击的元素
  3. click 事件委托到非 documentbody 的父级元素上
  4. 给目标元素加一条样式规则 cursor: pointer;

推荐后两种。从解决办法来看,推测在 safari 中,不可点击的元素的点击事件不会冒泡到父级元素。通过添加 cursor: pointer 使得元素变成了可点击的了。

iOS input验证码自动填充重复

在iOS12的某些机型上,当收到验证码,自动填充input框的时候,会出现两次填充的情况,如下图:

4LLcNd

解决办法:

// 限制验证长度 防止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的格式来解析时间的。

解决方案:尽量使用时间戳的形式来解析时间,或者使用/的形式。