首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法在被动事件侦听器内部执行preventDefault - Swipebox Mobie

问题背景

在使用Swipebox Mobile库时,可能会遇到在被动事件侦听器内部无法执行preventDefault的问题。这个问题通常与浏览器的默认行为和事件处理机制有关。

基础概念

  1. 被动事件侦听器:被动事件侦听器是一种特殊的事件侦听器,它告诉浏览器不会调用preventDefault方法。这有助于提高滚动性能,特别是在触摸设备上。
  2. preventDefault:这是一个事件处理方法,用于阻止浏览器执行某个事件的默认行为。

问题原因

现代浏览器默认将触摸事件和滚动事件设置为被动事件侦听器,以提高性能。如果在这些事件的侦听器中尝试调用preventDefault,浏览器会抛出一个错误,因为被动事件侦听器不允许调用preventDefault

解决方案

要解决这个问题,可以在添加事件侦听器时显式地设置{ passive: false },这样就可以在事件处理函数中调用preventDefault

示例代码

代码语言:txt
复制
document.addEventListener('touchstart', function(event) {
  event.preventDefault();
}, { passive: false });

参考链接

应用场景

这个问题通常出现在移动设备上的触摸事件处理,特别是在使用第三方库(如Swipebox Mobile)时。确保在处理触摸事件时正确设置事件侦听器的选项,可以避免这类问题。

总结

在被动事件侦听器内部无法执行preventDefault的问题,通常是由于浏览器的默认行为和事件处理机制导致的。通过显式设置事件侦听器的{ passive: false }选项,可以解决这个问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

jimojianghu

以前,如果要禁止移动端设备的触摸屏上,手指缩小放大的功能,都会想到使用viewport 来处理。...passived 实际上就是告诉浏览器,某个事件监听是否会使用 preventDefault 来阻止默认行为,便于浏览器优化性能。特别是浏览器优化页面滚动时的性能,可以让页面滚动更顺滑。...Chrome中,wheel / touch 等事件中的 passive 会默认设置为true,但Safari不支持。...由于目标被视为被动,因此无法被动事件侦听器中阻止默认行为。 可能的发生情景:移动端使用touch事件后,垂直平移时的报错。...方法一:使用 touch-action 样式来禁止垂直平移的默认行为 touch-action: pan-y; 方法二:监听 touch事件 中,明确设置 passive 为 false,声明不是被动

3.8K00

让页面滑动流畅得飞起的新特性:Passive Event Listeners

当属性passive的值为true的时候,代表监该听器内部不会调用preventDefault函数来阻止默认滑动行为,Chrome浏览器称这类型的监听器为被动(passive)监听器。...是被动监听mousewheel事件,即handler内部不会调用事件preventDefault函数。...只要输入事件要在内核线程执行逻辑,那么遇到内核线程忙,必然无法立即得到响应。...浏览器只有等内核线程执行事件监听器对应的JavaScript代码时,才能知道内部是否会调用preventDefault函数来阻止事件的默认行为,所以浏览器本身是没有办法对这种场景进行优化的。...对应这种场景(如上图中的MouseWheel Handlers:YES-Passive:No分支),合成线程无法知道对应的监听器内部是否会调用preventDefault函数来阻止默认行为,此时合成线程只能将该输入事件派发给内核线程处理

1.4K70
  • 让页面滑动流畅得飞起的新特性:Passive Event Listeners

    当属性passive的值为true的时候,代表该监听器内部不会调用preventDefault函数来阻止默认滑动行为,Chrome浏览器称这类型的监听器为被动(passive)监听器。...是被动监听mousewheel事件,即handler内部不会调用事件preventDefault函数。...只要输入事件要在内核线程执行逻辑,那么遇到内核线程忙,必然无法立即得到响应。...浏览器只有等内核线程执行事件监听器对应的JavaScript代码时,才能知道内部是否会调用preventDefault函数来阻止事件的默认行为,所以浏览器本身是没有办法对这种场景进行优化的。...对应这种场景(如上图中的MouseWheel Handlers:YES-Passive:No分支),合成线程无法知道对应的监听器内部是否会调用preventDefault函数来阻止默认行为,此时合成线程只能将该输入事件派发给内核线程处理

    9.2K00

    Unable to preventDefault inside passive event listener due to target being treated as passive 怎么办?

    翻译一下:chrome 监听touch类事件报错:无法被动侦听事件preventDefault,是新版本chrome 浏览器报错。...说明:说一下这个 preventDefault()是个什么鬼,这个是取消默认事件的,如果这个函数起作用的,比如默认的表单提交,a链接的点击跳转,就不好用了。...现在:google就决定默认取消了对这个事件的检查,默认时间就取消了。直接执行滑动操作。这样就更加的顺滑了。 但是浏览器的控制台就会进行错误提醒了。...具体情况: 从 chrome56 开始, window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive: true。...: body { margin: 0; height: 2000px; background: linear-gradient(to bottom, red, green); } //

    81610

    让 touch 系列事件触发的滚动响应更快

    为了解决这问题,Chrome (通过允许往addEventListener()中传入{passive: true})让touch系列事件事件监听器变为“被动”(译者注:其实就是touch之后,不再是执行事件函数后再滚动...然而,问题是大多数情况下是不会在事件处理函数中调用preventDefault(),但浏览器需要等到事件处理函数执行完之后才能确定这点。因而开发者可以定义“被动事件监听器”去解决这问题。...当你注册 touch 系列事件的监听器时,加入{passive: true}对象作为第三个参数后,浏览器就认为你不会在事件处理函数中调用 preventDefault(),它就可以安全地让页面滚动,不再等待事件处理函数执行完...我们看到,其中大约80%表现上都是“被动(译者注:也就是并未调用 preventDefault() )”的,但(开发者)却基本没将该事件的监听器注册为“被动”。...: 等同于: 现在,事件处理函数中,调用preventDefault()将会被忽略。

    97220

    Unable to preventDefault inside passive event listener due to target being treated as

    See https://www.chromestatus.com/features/5093566007214080 造成原因: 由于浏览器必须要在执行事件处理函数之后,才能知道有没有掉用过 preventDefault...所以为了让页面滚动的效果如丝般顺滑,从 chrome56 开始, window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive...浏览器忽略 preventDefault() 就可以第一时间滚动了。...导致的问题: 浏览器触发touchstart,touchmove事件的时候,e.preventDefault()会被浏览器忽略掉,并不会阻止默认行为。...解决方案: 1,注册处理函数时,用如下方式,明确声明为不是被动的 window.addEventListener('touchmove', fn, { passive: false }) 2、应用 CSS

    1K10

    「后端小伙伴来学前端了」关于Vue中的自定义事件,组件绑定自定义事件实现通信

    停止冒泡 .prevent - 调用 event.preventDefault()。 阻止默认行为 .capture - 添加事件侦听器时使用 capture 模式。....self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。 .{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。....passive - (2.3.0) 以 { passive: true } 模式添加侦听器 这些修饰符部分是可以串联起来使用的。 作用: 绑定事件监听器。事件类型由参数指定。...$on其实就是实现全局事件总线的原理。 二、自定义事件 简单图示: 我们给App组件中,通过v-on或者@给A组件绑定一个自定义事件,它的触发时机是等到A组件在内部调用this....--绑定自定义事件 send-message:是我们自定义事件名, 后面的sendMessage自定义事件被触发执行的回调函数 --> <Demo1 v-on:send-message="sendMessage

    1.9K10

    学会一行CSS即可提升页面滚动性能

    我们经常会碰到类似设置半透明遮罩的需求,通常是绝对定位一个div盖元素上方,这时遮罩层的鼠标事件优先级会更高,使得打上遮罩的元素无法进行正常交互行为,此时只需给遮罩设置 pointer-events:...touchstart 或 touchmove 事件中用 event.preventDefault() 阻止系统默认事件,不就可以阻止手势操作吗?...监听事件都是先进行了"触摸"才能执行回调,如果需要阻止默认事件,那么就必须在触摸开始前就检查是否需要阻止,滑动响应的优先级反而降低了,Google为了保证滑动流畅性就默认取消了这一机制。...所以从 chrome56 开始,如果你全局 touch 事件中不声明这是"非被动"操作,那么chrome浏览器会默认不执行并报错。...,它相当于先声明了元素的可用触摸事件,这样浏览器就不会报错了,preventDefault() 也不会影响到触摸的事件,这两者可以结合来使用。

    3.2K30

    JavaScript面试问题:事件委托和this

    所有现代浏览器支持preventDefault方法,这个方法会阻止浏览器处理事件的默认行为。一个常见示例就是链接,使用链接执行UI操作是一种常见的做法。...使用事件委托能减少监听器数量,元素的容器上绑定事件意味着只需要一个监听器。这种方法的缺点是,父容器的侦听器可能需要检查事件来选择正确的操作,而元素本身不会是一个监听器。...父容器层次的监听器能处理多种不同的事件操作,这是一种简单的方法来管理相关的事件操作,这些事件通常需要执行相关功能或需要共享数据。...如果父容器是监听器,然后要执行独立的内部操作而并不需要添加或者移除本身的监听器。...元素操作单页应用中是极其常见的,为某部分添加一个按钮这样简单的事情也会为应用程序创建一个潜在的性能块,没有合适的事件委托,就必须手动为每一个按钮添加监听,如果每个侦听器不清理干净,它可能会导致内存泄漏

    1.3K50

    Unable to preventDefault inside passive event listener

    Making touch scrolling fast by default 简而言之: 由于浏览器必须要在执行事件处理函数之后,才能知道有没有掉用过 preventDefault() ,这就导致了浏览器不能及时响应滚动...所以为了让页面滚动的效果如丝般顺滑,从 chrome56 开始, window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive...: body { margin: 0; height: 2000px; background: linear-gradient(to bottom, red, green); } // ...两个方案: 1、注册处理函数时,用如下方式,明确声明为不是被动的 window.addEventListener('touchmove', func, { passive: false }) 2、应用...CSS 属性 touch-action: none; 这样任何触摸事件都不会产生默认行为,但是 touch 事件照样触发。

    1.4K20

    js 事件笔记

    一、事件简述 1、事件概念 Web中, 事件浏览器窗口中被触发,执行事先绑定的事件处理器(也就是事件触发时会运行的代码块),对事件做出响应。...如果事件不传播,我们无法确定我们点击的对象是什么? 2、事件流三种模型 2.1事件冒泡模型 事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的元素。...三、事件处理程序(事件侦听器(listener)) 1、概念 事件处理程序:事件触发后,执行响应对应事件的程序。...3.4 removeEventListener解绑事件 通过addEventListener添加的事件处理程序只能通过removeEventListener移除,移除时参数与添加的时候相同 添加的匿名函数无法移除...input[name=username]').value==='sjz'){ this.submit() } }) 结果 2.4target和currenttarget 事件处理程序内部

    11K21

    vue核心知识点

    v-show适合频繁切换 vue常用修饰符 v-on 指令常用修饰符 .stop 调用event.stopPropagation() 禁止事件冒泡 .prevent 调用envent.preventDefault...() 阻止事件默认行为 .capture 添加事件侦听器使用capture模式 .self 当事件是从侦听器绑定的元素本身触发时才触发的回调 ....特性名转换成camelCase .sync 语法糖,会拓展成一个更新父组件绑定值的v-on侦听器 v-model 指令常用修饰符 .lazy 取代input监听change事件 .number 输入字符串转为数字...并不是直接更新DOM,而是开启一个队列,并缓冲在同一个事件循环中发送的所有数据改变,缓存中会去除重复数据,从而避免不必要的计算和DOM操作,然后,在下一个事件循环tick中,Vue刷新队列并执行实际(... vue中子组件调用父组件的方法 通过v-on监听和$emit触发来实现 父组件中通过v-on监听当前实例上的自定义事件 子组件中通过$emit触发当前实例上的自定义事件 // 父组件 <template

    1.9K10

    现代浏览器探秘(part4):事件处理

    因为选项卡内部的内容由渲染器进程处理,所以浏览器进程会把事件类型(如touchstart)及其坐标发送到渲染器进程。 渲染器进程通过查找事件目标并运行附加的事件侦听器来适当地处理事件。 ?...图4:覆盖整个页面的非快速可滚动区域进行输入 为了缓解这种情况,你可以事件侦听器中传递passive:true选项。 这向浏览器提示你仍然希望主线程中监听事件,同时合成器也可以继续并合成新帧。...鼠标事件中使用 passive:true 选项意味着可以平滑滚动页面,但是在你想要用preventDefault 来限制滚动方向时,垂直滚动可能已经开始了。...下一步 本系列中,我们介绍了Web浏览器的内部工作原理。...例如,如果要确保应用永远不会阻止解析,或者可以同步脚本策略上运行应用。 启用 sync-script: 'none' 时,将禁止解析器阻止 JavaScript 执行

    1.3K20

    Vue 指令知多少

    .prevent:调用event.preventDefault()。 .capture:添加事件侦听器时使用 capture 模式。 .self:只当事件是从侦听器绑定的元素本身触发时才触发回调。 ....{keyCode | keyAlias}:只当事件是从特定键触发时才触发回调。 .native:监听组件根元素的原生事件。 .once:只触发一次回调。....passive:(2.3.0) 以{ passive: true }模式添加侦听器 说明: 绑定事件监听器。 用在普通元素上时,只能监听原生 DOM 事件。...绑定 class 或 style 特性时,支持其它类型的值,如数组或对象。 绑定 prop 时,prop 必须在子组件中声明。可以用修饰符指定不同的绑定类型。...只可信内容上使用v-html,永不用在用户提交的内容上。 单文件组件里,scoped的样式不会应用在v-html内部,因为那部分 HTML 没有被 Vue 的模板编译器处理。

    1.6K40
    领券