事件节流方法

事件节流,简而言之就是防止事件被频繁触发;

不多说,上代码;

import DOM from '../methods/DOM';// 这是我之前单独写的一个绑定移除dom事件的方法;

class EventThrottle {
  constructor() {
    this.arr = []; // 保存所有绑定了事件节流的对象
  }

  // FN方法 duration时间,触发的最大频率  eventType动作(click或其他)  eventTarget对象
  add({ FN, duration, eventType, eventTarget }) {
    let timer = null;
    const symbol = Symbol(Date.now());
    const hFN = (e) => {
      if (!timer) {
        FN(e);
        timer = setTimeout(() => {
          clearTimeout(timer);
          timer = null;
        }, duration);
      }
    };
    const target = eventTarget || document;

    const removeFN = DOM.ListenerFN({
      target,
      FN: hFN,
      event: eventType,
    });

    this.arr.push({
      removeFN,
      symbol,
    });
    return symbol;
  }

  remove({ symbol }) {
    this.arr.filter((item) => {
      if (item.symbol !== symbol) {
        return true;
      }
      item.removeFN();
      return false;
    });
  }
}

const eventThrottle = new EventThrottle(); // 实例化

export default eventThrottle; // 返回实例化对象

在外部的话,引用后,通过add方法添加,remove方法来移除;

eventThrottle.add({ FN, duration, eventType, eventTarget }); // 会返回一个symbol
eventThrottle.remove({symbol});
节流是用于用户在与页面交互时控制事件发生的频率,一般场景是单位的时间或其它间隔内定时执行操作。一段时间内,事件在每次到达规定的间隔 n 秒时触发一次[^3]。 节流方法的实现有以下几种: - **使用第三方库**:可以使用 lodash 库的 `_.throttle` 方法。示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style> .box { width: 500px; height: 500px; background-color: #ccc; color: #fff; text-align: center; font-size: 100px; } </style> </head> <body> <div class="box"></div> <script src="./lodash.min.js"></script> <script> const box = document.querySelector('.box') let i = 1 // 鼠标移动函数 function mouseMove() { box.innerHTML = i++ // 如果里面存在大量操作 dom 的情况,可能会卡顿 } box.addEventListener('mousemove', _.throttle(mouseMove, 500)) </script> </body> </html> ``` 此方式只需引入 lodash 库,调用 `_.throttle` 函数并传入要节流的函数和时间间隔即可实现节流功能 [^2]。 - **js 手写实现**: - **定时器版本**:通过设置定时器,在规定时间后执行函数,若在规定时间内重复触发事件,会清除之前的定时器并重新计时。 - **时间戳版本**:记录事件触发的时间戳,每次触发事件时,与上一次触发的时间戳进行比较,若超过规定的间隔时间,则执行函数 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值