当前位置: 首页 > 知识库问答 >
问题:

如何检查侦听器事件是否为被动事件?

红存
2023-03-14

我正在编写一个手势/动作库,它还管理事件侦听器和触发。我已经实现了我的库,通过一个API支持手势对象设置被动侦听器,该API如下:this。在('touchstart.passive',this.startHandler,{reject:errorHandler})上。My lib支持多种手势,设置多个听众,包括被动和非被动。lib将确保最多只有一个真正的侦听器连接到DOM。因此,我们最多可以有2个touchstart监听器,其中一个是被动监听器,另一个不是。

我的问题和问题是,我无法检测接收到的事件是否附加了{被动: true}选项。我认为我可以在本机事件对象上使用可取消的属性,因为在被动事件上调用预防默认()是错误的。但是可取消属性始终为true,即使浏览器会抛出一个错误。

我已经阅读了关于事件监听器的whatwgdom标准,并在Firefox和Chrome中进行了一些测试,但找不到关于如何区分这两种类型事件的任何信息。

这对我的库很重要,因为被动事件侦听器是用“.passive”后期修复程序键入的,例如“touchstart.passive”“touchstart”

如何检查被动选项接收的DOM事件,以便触发正确的内部侦听器?

编辑

目前,我的附加侦听器流程的要点是:

function eventNotifier(event) {
    this.fire(event.cancelable ? event.type : event.type + '.passive', new GestureEvent(event))
}

addEvent(el, realEventName, eventNotifier, options)
nativeListeners.set(eventName, 1)

function addEvent (el, type, listener, options) {
    el.addEventListener(type, listener, options || true)
}

其中,nativellisteners是跟踪真实事件侦听器的映射


共有2个答案

靳涵亮
2023-03-14

写一个if语句来检查侦听器是否附加了“。被动”。

陈浩
2023-03-14

在调用event.preventDefault();之后,可以测试event.defaultPrevent的值。如果调用是被动事件,浏览器会抛出警告/错误,但是它不会停止javascript的执行。因此,以下措施应该行得通:

document.addEventListener('touchstart', function(event) {
  event.preventDefault();
  
  if (event.defaultPrevented) {
    // This is not a passive event
  } else {
    // This is a passive event
  }
}, { passive: true });
 类似资料:
  • 在致力于提高渐进式web应用程序的性能时,我遇到了一个新功能,我发现很难理解这个概念。 什么是被动事件侦听器,在我们的项目中需要它吗?

  • 问题内容: 这是我的问题:是否可以通过某种方式检查是否存在动态附加的事件侦听器?或者如何检查DOM中“onclick”(?)属性的状态?但是没有运气。这是我的html: 然后在Javascript中,将动态创建的事件侦听器附加到第二个链接: 该代码运行良好,但是我所有检测该附加侦听器的尝试均失败: 如果单击“为2添加onclick”,然后单击“[链接2]”,则事件触发良好,但“测试链接2”始终报告

  • 问题内容: 在努力提高渐进式Web应用程序的性能时,我遇到了一项新功能,但我很难理解这一概念。 在我们的项目中有什么以及有什么需要? 问题答案: 被动事件侦听器是一种新兴的网络标准,是Chrome51附带的一项新功能,可极大提高滚动性能。 通过消除滚动以阻止触摸和滚轮事件监听器的需求,它使开发人员可以选择更好的滚动性能。 问题: 所有现代浏览器都具有线程化滚动功能,即使在运行昂贵的JavaScri

  • 单击选择元素显示此警告: [违规]将非被动事件侦听器添加到滚动阻止“鼠标滚轮”事件。将事件处理程序标记为“被动”以使页面更加响应。 问题是,这也扩大了谷歌浏览器中HTML页面的高度。在Chrome版本59.0中测试。3071.86(官方版本)(64位)在firefox中不会出现这种情况。 简单代码:https://jsfiddle.net/gurigraphics/2399mnyb 如果自定义滚动

  • 问题:我正在尝试为我的应用程序创建一个组件,其他组件将使用该组件渲染表。它可能有三个可能的单元格值: 文本 HTML 组成部分 我能够呈现上面所有的值,但是我在绑定侦听器时遇到了困难。我试图实现的是这样的:传递一个要绑定到组件的方法和事件,表应该将其绑定到相应的单元格。例如: 表JSON 表组件 上面只是我正在尝试的一个片段,表循环通过传递的对象并相应地呈现。 我已经试过了 因此,解决方案1 因此

  • 在用java编写Minecraft插件时,您可以创建一个事件监听器方法,并将其命名为任意名称,但您必须传入事件监听者的类,例如: 我只是想知道,如果Bukkit API中的任何类都不知道该方法的名称,那么该方法是如何在“幕后”执行的?我希望我能很好地解释自己。谢谢