移动端 关闭浏览器事件_解决移动端浏览器自带回弹效果

今天在解决项目里面的页面签名的问题,在移动端调试的时候,发现普遍移动端浏览器都有下拉回弹这么一个动画。

虽然这是比较人性化的设计,但是面对需要固定在一个区域监控动作的交互来说,这简直就是令人头大的设计。

查了很多网上的资料,普遍来说都聚焦在了 documenttouchmove 事件上来,并且都在事件里面对进行了 preventDefault 来阻止事件的进行,示例如下:

document.addEventListener('touchmove',function(ev){
  ev.preventDefault();
});

不过在实际运行的时候,控制台会报错:Unable to preventDefault inside passive event listener

wtf!?这是什么情况,为什么会报这个错误。

看字面意思大概是: 无法将 preventDefault 放在被动事件的监听中

在网上搜寻了很久,一些解析文章都把焦点放在了最后一个参数上。于是去看了看MDN的文档,有点豁然开朗的感觉。

target.addEventListener(type, listener[, options]);
target.addEventListener(type, listener[, useCapture]);
target.addEventListener(type, listener[, useCapture, wantsUntrusted  ]);  // Gecko/Mozilla only

我们一般使用 addEventListener 的时候,大部分使用的第二种方式,第三个参数为 boolean 来判断是否采用事件捕获的事件传播方式。

那么第一种呢?MDN对 options 的参数解释如下:

options 可选

一个指定有关 listener 属性的可选参数对象。可用的选项如下:

  capture:  Boolean,表示 listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。

  once:  Boolean,表示 listener 在添加之后最多只调用一次。如果是 true, listener 会在其被调用之后自动移除。

  passive: Boolean,设置为 true 时,表示 listener 永远不会调用 preventDefault()。如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告。

  mozSystemGroup: 只能在 XBL 或者是 Firefox 、 chrome 使用,这是个 Boolean,表示 listener 被添加到 system group。

看来我们的控制台报错问题可以通过设置 options 中的 passive 参数来解决 preventDefault 不能被动调用的问题。

document.addEventListener('touchmove',function(ev){
  ev.preventDefault();
},{passive:false});

果然再次调试的时候,就不会再触发页面的滑动事件了。

参考文章:

  • MDN: Event​Target​.add​Event​Listener()
  • 滑动时候警告:Unable to preventDefault inside passive event listener
  • chrome 监听touch类事件报错:无法被动侦听事件preventDefault
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值