事件

优质
小牛编辑
165浏览
2023-12-01

事件流

方式

传递方向

捕获

document ---> html ---> body ---> 目标对象

冒泡

目标对象 ---> body ---> html ---> document

事件模型

模型

绑定方式

阶段

DOM 0 级

<button onclick="">button.onclick = function() {}

IE 特有

button.attachEvent()

处理阶段、冒泡阶段

DOM 2 级

button.addEventListener()

捕获阶段、处理阶段、冒泡阶段

事件对象

操作

DOM 事件模型

IE 专有事件模型

获取事件类型

type

type

获取事件目标

target

srcElement

阻止冒泡

stopPropagation()

cancelBubble

阻止默认行为

preventDefault()

returnValue

兼容处理

function eventHandler( event ) {  event = event || window.event;​  const el = event.target || event.srcElement;​  ...}

事件处理

低版本的 IE 浏览器(IE 9 之前的)中需要用 attachEventdetachEvent 进行事件的添加和删除;其他浏览器中用 addEventListenerremoveEventListener

添加事件

if ( el.addEventListener ) {  el.addEventListener("click", handler, false);}else {  el.attachEvent("onclick", handler);}

删除事件

if ( el.removeEventListener ) {  el.removeEventListener("click", handler);}else {  el.detachEvent("onclick", handler);}

触发事件

try {​}catch (e) {​}

防抖与节流

防抖(debounce)和节流(throttle)的作用都是防止函数多次调用。区别在于——假设一个用户一直触发这个函数,且每次触发函数的间隔小于 wait,防抖的情况下只会调用一次,而节流的情况会每隔一定时间(参数 wait)调用函数。

防抖的使用场景:

  • 文本输入相关逻辑,如搜索、校验。

节流的使用场景:

  • DOM 元素的拖拽(mousemove);

  • 射击游戏的 mousedownkeydown 事件(单位时间只能发射一颗子弹);

  • 计算鼠标移动的距离(mousemove);

  • Canvas 模拟画板功能(mousemove);

  • 监听 scroll 事件滚动到页面底部加载更多内容。