【问题标题】:Which jQuery events do not bubble?哪些 jQuery 事件不会冒泡?
【发布时间】:2025-12-02 21:50:01
【问题描述】:

非常简单,我一直在搜索所有不冒泡的 jQuery 事件的完整列表,但我一直找不到。

例如,我正在寻找 image.loadXMLHttpRequest.error 等事件。

【问题讨论】:

  • 与 jQuery 无关,因为 jQuery 是 JavaScript。
  • @j08691 - 这取决于,jQuery 为一些通常不会冒泡的事件添加冒泡。
  • @j08691 不幸的是,这是不正确的。由于浏览器事件实现的不一致,jQuery.Event 对象充当实际浏览器事件的代理。这方面的一个例子是 blurfocus 事件,它们在普通 js 中不会冒泡,但在 jQuery 中会冒泡(在别名事件名称下)
  • 我误解了你的目的。

标签: javascript jquery javascript-events


【解决方案1】:

The docs for jQuery's on() method says this(在“附加说明”下);

focusblur 事件由 W3C 指定为不冒泡,但 jQuery 定义了跨浏览器的 focusinfocusout 事件会冒泡。当focusblur 用于附加委托事件处理程序时,jQuery 映射名称并将它们分别作为focusinfocusout 传递。为保持一致性和清晰性,请使用冒泡事件类型名称。

在所有浏览器中,loadscrollerror 事件(例如,在 <img> 元素上)不会冒泡。在 Internet Explorer 8 及更低版本中,pastereset 事件不会冒泡。 此类事件不支持与委托一起使用,但可以在事件处理程序直接附加到生成元素时使用事件。

我已经粗体强调最相关的句子。

在文档的前面(在“直接和委托事件”下,它也这样说:

在 Internet Explorer 8 及更低版本中,changesubmit 等一些事件本身不会冒泡,但 jQuery 将这些事件修补为冒泡并创建一致的跨浏览器行为。

您还会发现 mouseleavemouseenter 不会冒泡(为此请使用 mouseovermouseout 事件)。这在他们各自的文档中进行了讨论。

我不会开始称上面的列表很全面,但这是一个开始。我不确定 XMLHttpRequest 在您的问题中是如何出现的;它不是 DOM 的一部分,因此没有任何祖先,因此不能像普通 DOM 事件那样真正冒泡

【讨论】:

  • 我很欣赏给出的列表,但我需要存储一个实际的事件名称数组,这些名称不会冒泡,以便使用 Google Analytics 进行事件跟踪。具体来说,我需要知道哪些事件必须直接附加到对象上,哪些事件可以委托。 XMLHttpRequest 上下文中的一个用例是跟踪某些 AJAX 调用上的 load 事件
  • @wvandaal:为什么不总是附加到对象上?我仍然不明白 XMLHttpRequest 的用例;除了订阅 onreadystatechange 之外,您可以检测到 XMLHttpRequest 完成 (AFAIK) 的唯一方法是等待 DOMSubtreeModified 事件,并假设它是因为 AJAX 调用?我推荐替代方法,因为我不确定您是否会获得完整的列表。如果您考虑非标准、草稿、浏览器扩展,则有数百个事件,那么您的事件会在某些事件中冒泡,而在其他事件中不会冒泡。这是一件很难实现的事情:)
【解决方案2】:

根据DOM Level 3 Events spec

  • 冒泡事件:

    beforeinputclickcompositionstartcompositionupdatecompositionenddblclickfocusinfocusoutinputkeydownkeydown,@9867654333 、mousemovemouseoutmouseovermouseupselectwheel

  • 不会冒泡的事件:

    abort, blur, error, focus, load, mouseenter, mouseleave, resize, scroll(*), @ 987654350@

注意 DOM Level 3 事件并没有定义所有事件,其中一些是由 HTML5 规范定义的。

该规范不太清楚,因为并不总是说明事件是否冒泡并在非规范部分定义了一些事件。其中之一是drag-and-drop eventsbubble:

dragstartdragdragenterdragexitdragleavedragoverdropdragend


(*) 当在 Document 元素上调度时,scroll 事件类型必须冒泡到 defaultView 对象。

【讨论】:

    最近更新 更多