js 事件
事件的冒泡和捕获
js 事件流大体分为三个阶段,描述了事件在 dom 文档中传播的顺序:
- 捕获阶段:事件从文档的根节点开始,向目标元素传播。(由外向内)
- 目标阶段:事件到达目标元素。
- 冒泡阶段:事件从目标元素向根节点传播。(由内向外)
当点击一个子元素触发某个事件时,如果其父元素也绑定了相同的事件,那么子元素和父元素都会触发相同的事件函数。如果只想触发子元素,则可以在子元素中使用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)等出错时才会触发。