事件流
dom事件以流的形式传递,先从最外层元素向最内层元素流过,此过程称为捕获,到达最内层元素后又重新向最外层元素流动,此过程称为冒泡。
通过addEventListener绑定事件,默认是在冒泡阶段触发事件,如果useCapture设置为true,则事件是在捕获阶段触发。一个事件只会触发一次,要么冒泡阶段,要么捕获阶段。
可以通过event.stopPropagation()阻止事件流,如果是在捕获阶段阻止了事件流,那也就没有冒泡阶段了。event.stopImmediatePropagation()不仅阻止了事件流,连自身元素的其他相同类型的未执行事件也阻止了
passive介绍
浏览器内核渲染页面时有2个线程,一个主线程,负责js执行,另一个绘制线程,负责绘制画面。当事件触发时,主线程负责执行事件回调函数,完事后告诉绘制线程可以绘制画面了,但是如果主线程一直很忙,事件回调函数就迟迟不能执行,绘制画面也就卡住了,用户就感知到了卡顿。
为什么绘制线程要等待主线程 ?
事件回调函数中可能存在event.preventDefault()语句,这个语句的执行是会影响绘制线程的执行的,所以要等待回调执行结束,才能知道回调函数中是不是有event.preventDefault()
passive如果设置为true,则绘制线程不用等待主线程了,它们可以并行执行,回调函数中的event.preventDefault()不再起作用,如果有,执行到这句时,浏览器会给出警告
EventTarget.addEventListener()让页面滑动流畅得飞起的新特性:Passive Event Listeners