今天在解决项目里面的页面签名的问题,在移动端调试的时候,发现普遍移动端浏览器都有下拉回弹这么一个动画。
虽然这是比较人性化的设计,但是面对需要固定在一个区域监控动作的交互来说,这简直就是令人头大的设计。
查了很多网上的资料,普遍来说都聚焦在了 document
的 touchmove
事件上来,并且都在事件里面对进行了 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});
果然再次调试的时候,就不会再触发页面的滑动事件了。
参考文章: