解决移动端浏览器自带回弹效果

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

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

查了很多网上的资料,普遍来说都聚焦在了 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

你可能感兴趣的:(解决移动端浏览器自带回弹效果)