移动端开发05 移动端的事件点透

触摸事件的响应顺序

  1. ontouchstart
  2. ontouchmove
  3. ontouchend
  4. onclick
graph LR
ontouchstart-->ontouchmouve
ontouchmouve-->ontouchend
ontouchend-->onclick

现象

当A/B两个层上下z轴重叠,上层的A点击后消失或移开(这一点很重要),并且B元素本身有默认click事件(如a标签)或绑定了click事件。在这种情况下,点击A/B重叠的部分,就会出现点透的现象。

原因

是由于浏览器事件派发机制导致的,并非冒泡的原因。

zepto的tap事件是通过兼听绑定在document上的touch事件来完成tap事件的模拟的,并且tap事件是冒泡到document上触发的

在移动端不使用click而用touch事件代替触摸是因为click事件有300ms延迟

由于我们在touchstart阶段就已经隐藏了A,300ms后click事件触发时,浏览器将click事件派发到了B,导致了异常的发生。

解决方法:

1 使用fastClick

fastClick将touch事件绑定到了body元素或顶层元素,在touch事件中标记手势的位置和时间,根据此信息拦截了300ms后的真正的click事件

具体的源码分析参考这篇文章

2 使用touchend代替tap

对于B元素本身存在默认click事件的情况,应用touchend代替tap事件并阻止A元素touchend的默认行为preventDefault(),从而阻止click事件的产生。

$("#aa").on("touchend", function (event) {
  //很多处理比如隐藏什么的
  event.preventDefault();
});

由于PC端是不支持touchend事件的,可以同时绑定touchendclick事件

$("#save_and_back").on("touchend", function(e) {
  save_article(article_data).then(function(res) {
    location.href = "home.html";
  });
  e.preventDefault();
});
$("#save_and_back").on("click", function(e) {
  save_article(article_data).then(function(res) {
    location.href = "home.html";
  });
  e.preventDefault();
});

原理是:

在PC端上,没有touchend事件,只有click事件被绑定上了。

在移动端上,绑定了touchendclick事件,但是touchend事件优先级比click高,并且阻止了事件继续冒泡。所以两个端上都能完美实现效果,具体还有没有其他的问题暂时不得而知。

3 延时执行

通过延时执行tap的事件,错开click被触发的时机

$("#aa").on("tap", function(event) {
  setTimeout(function() {
    //很多处理比如隐藏什么的
  }, 320);
});

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值