feng xiaohan

js 事件

事件的冒泡和捕获

js 事件流大体分为三个阶段,描述了事件在 dom 文档中传播的顺序:

  1. 捕获阶段:事件从文档的根节点开始,向目标元素传播。(由外向内)
  2. 目标阶段:事件到达目标元素。
  3. 冒泡阶段:事件从目标元素向根节点传播。(由内向外)

当点击一个子元素触发某个事件时,如果其父元素也绑定了相同的事件,那么子元素和父元素都会触发相同的事件函数。如果只想触发子元素,则可以在子元素中使用e.stopPropagation()阻止事件传播(无论是冒泡阶段还是捕获阶段)。

阻止了之后点击子元素时后续元素都不会触发该事件了。

addEventListener(type, listener, options)
options: bool,该事件是否在捕获或冒泡阶段执行,
默认不会在捕获阶段执行(false)
;如果设置为 true,会在捕获阶段执行这个事件,这会导致事件再还没到达指定元素时就先被外层设置了为 true 的父元素上的监听器捕获到。

小结

  • e.stopPropagation()阻止事件传播(既可以阻止捕获阶段又可以阻止冒泡阶段);
  • adddEventListener(type, listener, options)`:中的第三个设置是否在事件捕获阶段执行;

其他事件

  • unhandledrejection:当有 Promise 返回 reject 或抛出异常,且该异常没有被 catch 时触发。
  • error:抛出异常时触发(img、script、css、and jsonp)。

    但是在 Promise 中抛出异常则不会触发该事件,可能是因为 Promise 中的异常被 catch 了,就不会触发该事件了吧(猜测)。
    解答:该事件是针对资源加载时的异常(img、script、css、and jsonp)等出错时才会触发。