博客
关于我
【JS】函数节流与函数防抖-自定义JS工具类
阅读量:563 次
发布时间:2019-03-09

本文共 2015 字,大约阅读时间需要 6 分钟。

浏览器事件处理与优化

浏览器事件是一个常见的开发任务,但某些事件的触发频率非常高,可能会导致页面性能下降或对服务器造成不必要的压力。为了应对这些问题,我们可以利用函数节流函数防抖两种方法来优化事件处理。


为什么需要节流?

许多浏览器事件,比如window.onresizewindow.mousemovewindow.scroll,会持续触发!滚动鼠标滚轮时,scroll事件甚至会被触发数次,这样频繁地向后台发送请求,不仅会导致页面卡顿,还会给服务器带来负担。

比如使用以下代码:

window.addEventListener("scroll", function (e) {    console.log(e);});

会发生什么?滚动一次会触发console.log多次!这显然是不合理的。


如何实现节流?

节流的方法是通过设置一个时间间隔,使得事件处理函数在一定时间内只执行一次。这样可以让频繁触发的事件按时间平均分配,减少不必要的计算量。

示例:滚动事件节流

使用throttle函数,可以让scroll事件每500ms执行一次:

import throttle from "./function/throttle.js";window.addEventListener(    "scroll",    throttle(function (e) {        console.log(e);    }, 500));

滚动页面时,console.log每隔500ms只会被执行一次。

适用场景

  • 窗口调整:用resize事件时频繁触发,可以用节流。
  • 页面滚动:同样适用于scroll事件。
  • 元素拖拽mousemove事件在长时间拖拽时会频繁触发。
  • 点击事件:比如快速点击按钮时,会连续触发click事件。

如何实现防抖?

防抖的方法是限制事件处理函数在一定时间内只执行一次,即使事件被多次触发。这种方式特别适用于频繁交互的用户操作。

示例:输入搜索防抖

使用debounce函数,可以让keydown事件每1000ms只执行一次:

import debounce from "./function/debounce.js";let input = document.querySelector("input");input.onkeydown = debounce(function (e) {    console.log(e.keyCode);}, 1000);

如果你同时按下多个键,这次keydown事件只会派往最后一个按下的键。

适用场景

  • 输入框联想:输入框每输入一个字符都会触发keyupkeydown事件,可以用防抖。
  • 实时搜索:避免每输入一个字符都发送请求,可以用防抖。

节流与防抖的区别

特性 节流 防抖
执行次数 每隔一定时间执行一次 上一次调用后再执行一次
适用场景 按时间平均分配事件触发 多次事件一次响应
防抖时间 不需要指定时间间隔 需要指定 preventFalseDuplicates
执行顺序 先执行,然后间隔时间再执行 只执行最后一次

例如,快速点击按钮会触发多次click事件,用debounce只会有一次正常响应。


完整代码示例

以下是优化后的代码示例,可以直接复制使用:

throttle.js

export default function throttle(callback, wait) {    let start = 0;    return function (e) {        if (Date.now() - start > wait) {            callback.call(this, e);            start = Date.now();        }    };}

debounce.js

export default function debounce(callback, time) {    let timeId = undefined;    return function (e) {        if (timeId !== undefined) {            clearTimeout(timeId);        }        timeId = setTimeout(() => {            callback.call(this, e);            timeId = undefined;        }, time);    };}

总结

通过合理使用节流防抖,可以显著优化浏览器事件处理,减少不必要的计算量和对服务器的压力。选择使用throttle还是debounce,取决于你的业务需求,希望这些代码示例能为你的开发提供帮助!

转载地址:http://mqtpz.baihongyu.com/

你可能感兴趣的文章
OpenCV 3.1 imwrite()函数写入异常问题解决方法
查看>>
OpenCV 4.1.0版drawContours
查看>>
Opencv cv2.putText 函数详解
查看>>
opencv glob 内存溢出异常
查看>>
opencv Hog Demo
查看>>
opencv Hog学习总结
查看>>
opencv Mat push_back
查看>>
opencv putText中文乱码
查看>>
OpenCV Python围绕特定点将图像旋转X度
查看>>
opencv resize
查看>>
Opencv Sift和Surf特征实现图像无缝拼接生成全景图像
查看>>
opencv SVM分类Demo
查看>>
OpenCV VideoCapture.get()参数详解
查看>>
opencv videocapture读取视频cap.isOpened 输出总是false
查看>>
opencv waitKey() 函数理解及应用
查看>>
OpenCV 中的图像转换
查看>>
OpenCV 人脸识别 C++实例代码
查看>>
OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
查看>>
Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
查看>>
opencv 模板匹配, 已解决模板过大程序不工作的bug
查看>>