梳理下常见的不冒泡事件

20190414154908.png

⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅

梳理下常见的不冒泡事件

UI 事件

  • load 异步 不冒泡 ❌
  • unload 不冒泡 ❌
  • abort 不冒泡 ❌
  • error 异步 不冒泡 ❌
  • select

load、unload 这些资源加载的事件不冒牌也是容易理解🤐html

Focus 事件

事件触发顺序见下表:前端

Event Type Notes
User shifts focus
focusin 第一个目标元素得到焦点以前触发
focus 第一个目标元素得到焦点以后触发
User shifts focus
focusout 第一个目标元素失去焦点以前触发
focusin 第二个目标元素得到焦点以前触发
blur 第一个目标元素失去焦点以后触发
focus 第二个元素得到焦点以后触发
  • blur 不冒泡 ❌
  • focus 不冒泡 ❌
  • focusin
  • focusout

要注意 blur 事件和 focus 事件都是不冒泡的,因获取和失去焦点自己就是针对这个元素的。若是要坚挺具体的焦点变化状况,那么应该使用 focusin 和 focusouthtml5

Mouse 事件

若是元素内部没有嵌套另外一个元素,事件触发的顺序见下表:异步

Event Type Element Notes
mousemove
移动到元素A
mouseover A
mouseenter A
mousemove A Multiple mousemove events
移出元素A
mouseout A
mouseleave A

若是元素A内部嵌套了元素B,事件触发顺序见下表:编辑器

Event Type Element Notes
mousemove
移动到元素A
mouseover A
mouseenter A
mousemove A Multiple mousemove events
移动到内嵌元素B
mouseout A
mouseover B
mouseenter B
mousemove B Multiple mousemove events
从新移动到A
mouseout B
mouseleave B
mouseover A
mousemove A Multiple mousemove events
移出元素A
mouseout A
mouseleave A

若是是下图所示spa

20190414131151.png

直接移动到元素C,常见于失去焦点再得到焦点的状况,事件触发顺序见下表:code

Event Type Element Notes
mousemove
直接移动到元素C
mouseover C
mouseenter A
mouseenter B
mouseenter C
mousemove C Multiple mousemove events
直接移出元素 C...
mouseout C
mouseleave C
mouseleave B
mouseleave A

20190414131545.png

能够看到 mouseover/mouseout 事件只触发一次,mouseenter/mouseleave 事件触发了三次htm

而后再看下 click 元素blog

Event Type Notes
mousedown
mousemove OPTIONAL, multiple events, some limits
mouseup
click
mousemove OPTIONAL, multiple events, some limits
mousedown
mousemove OPTIONAL, multiple events, some limits
mouseup
click
dblclick

Mouse 事件中有两个不冒泡事件:seo

  • click
  • dblclick
  • mousedown
  • mouseenter 不冒泡 ❌
  • mouseleave 不冒泡 ❌
  • mousemove
  • mouseout
  • mouseover
  • mouseup

mouseenter/mouseleave 看这个单词也是跟 focusin/focusout 同样专一于变化,所以这两个不冒泡的事件和 focus 事件做对比也容易理解 🌞

Wheel 事件

wheel 事件是冒泡事件

  • wheel 异步

Input 事件

事件触发顺序是 beforeinput,而后是 input,二者都是冒泡事件

  • beforeinput
  • input

Keyboard 事件

首先触发 keydown 事件,而后是 beforeinput、input,最后是 keyup;若是长时间按住不放,那么则是 keydown 事件、beforeinput 事件和 input 事件

Keyboard 所有是冒泡事件

  • keydown
  • keyup

Composition 事件

该事件是复合事件,用来处理输入法编辑器的输入。

该事件包括三个:

  • compositionstart 输入法编辑器打开状态,准备输入
  • compositionupdate 向输入字段插入新字符时触发
  • compositionend 输入法编辑器关闭时触发

⚠️ 须要注意的是,三个事件中只有第一个 compositionstart 事件是 cancelable 的,而且三个事件都是冒泡事件

其余

除此以外,还有监听 Node 节点插入移除事件也是不冒泡事件

  • DOMNodeInsertedIntoDocument 不冒泡 ❌
  • DOMNodeRemovedFromDocument 不冒泡 ❌

另外,html 中表单验证合法性 invalid 事件也是不冒泡的

  • invalid 不冒泡 ❌

indexedDB 中的一系列事件也都是不冒泡的,除了 abort 事件

  • abort
  • blocked 不冒泡 ❌
  • close 不冒泡 ❌
  • complete 不冒泡 ❌
  • success 不冒泡 ❌
  • upgradeneeded 不冒泡 ❌
  • versionchange 不冒泡 ❌

html5 的媒体事件 media Event 也都是不冒泡的

  • play 不冒泡 ❌
  • mute 不冒泡 ❌
  • 等等

html5 的 online offline、notification、push 等事件也都是不冒泡的;针对特定资源的 Progress 事件如 abort、load、progress、timeout 等等都是不冒泡的

针对特定选区的 selection API 的相关事件 selectionchange 是不冒泡的:

  • selectstart
  • selectionchange 不冒泡 ❌

SSE 的相关事件也是不冒泡的

html5 的 drag & drop 或 touch 事件则是冒泡的

JS 菌公众帐号

请关注个人订阅号,不按期推送有关 JS 的技术文章,只谈技术不谈八卦 😊

相关文章
相关标签/搜索