iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JavaScript防抖与节流怎么使用
  • 492
分享到

JavaScript防抖与节流怎么使用

2023-06-30 16:06:16 492人浏览 薄情痞子
摘要

这篇文章主要讲解了“javascript防抖与节流怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript防抖与节流怎么使用”吧!前言:防抖(Debounce) 

这篇文章主要讲解了“javascript防抖与节流怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript防抖与节流怎么使用”吧!

    前言:

    防抖(Debounce) 和 节流(Throttle) 技术用于限制函数执行的次数。通常,一个函数将被执行多少次或何时执行由开发人员决定。但在某些情况下,开发人员会将这种能力赋予用户,由用户决定执行该功能的时间和次数。

    例如,添加到clickscrollresize等事件上的函数,允许用户决定何时执行它们以及执行多少次。有时,用户可能会比所需更频繁地执行这些操作。这可能不利于网站的性能,特别是如果附加到这些事件的函数执行一些繁重的计算。在这种情况下,用户可以控制函数的执行,开发人员必须设计一些技术来限制用户可以执行函数的次数。

    举个例子,假设我们为滚动事件scroll添加了一个函数,该函数中会执行修改DOM元素的操作。我们知道,修改DOM元素大小开销很大,会引起浏览器的回流(Reflow)和重排(Repaint),以及重新渲染整个或部分页面。如果用户频繁滚动,导致该函数频繁被调用,可能会影响网页性能或导致页面卡顿等。
    此外,有些事件回调函数中包含ajax等异步操作的时候,多次触发会导致返回的内容结果顺序不一致,而导致得到的结果非最后一次触发事件对应的结果

    所以,为了优化网页的性能,控制函数被调用的频率是很有必要的,防抖(Debounce) 和 节流(Throttle) 是通过控制函数被调用的频率来优化脚本性能的两种方法

    一、防抖(Debounce)

    防抖:无论用户触发多少次事件,对应的回调函数只会在事件停止触发指定事件后执行。(即:回调函数在事件停止触发指定时间后被调用)

    JavaScript防抖与节流怎么使用

    例如,假设用户在 100 毫秒内点击了 5 次按钮。防抖技术不会让这些点击中的任何一个执行对应的回调函数。一旦用户停止点击,如果去抖时间为 100 毫秒,则回调函数将在 100 毫秒后执行。因此,肉眼看来,防抖就像将多个事件组合成一个事件一样。

    1.1 防抖函数的实现

    (1)版本1 —— 停止触发事件n毫秒后执行回调函数

    触发事件后函数不会立即执行,而是在停止事件触发后 n 毫秒后执行,如果在 n 毫秒内又触发了事件,则会重新计时

    function debounce(func, delay) {    let timer;  // 定时器    return function () {         let context = this;  // 记录 this 值,防止在回调函数中丢失        let args = arguments;  // 函数参数        //如果定时器存在,则清除定时器(如果没有,也没必要进行处理)        timer ? clearTimeout(timer) : null;         timer = setTimeout(() => {             // 防止 this 值变为 window            func.apply(context, args)         }, delay);    }}
    (2)版本2

    触发事件后立即执行回调函数,但是触发后n毫秒内不会再执行回调函数,如果 n 毫秒内触发了事件,也会重新计时。

      function _debounce(func, delay) {    let timer;  // 定时器    return function () {        let context = this;  // 记录 this 值,防止在回调函数中丢失        let args = arguments;  // 函数参数        // 标识是否立即执行        let isImmediately = !timer;        //如果定时器存在,则清除定时器(如果没有,也没必要进行处理)        timer ? clearTimeout(timer) : null;        timer = setTimeout(() => {            timer = null;        }, delay);        // isImmediately 为 true 则 执行函数(即首次触发事件)        isImmediately ? func.apply(context, args) : null;    }}

    举个例子来对比一下两个版本的区别:

    document.body.onclick= debounce(function () { console.log('hello') },1000)

    如上代码中,我们给body添加了一个点击事件监听器。

    • 如果是版本1的防抖函数,当我点击body时,控制台不会立即打印hello,要等 1000ms 后才会打印。在这 1000s 内如果还点击了 body,那么就会重新计时。即最后一次点击 body 过1000ms后控制台才会打印hello

    • 如果是版本2的防抖函数,当我首次点击body时,控制台会立马打印 hello,但是在此之后的 1000ms 内点击 body ,控制台不会有任何反应。在这 1000s 内如果还点击了 body,那么就会重新计时。必须等计时结束后再点击body,控制台才会再次打印 hello

    1.2 防抖的实际应用

    (1)搜索框建议项

    通常,搜索框会提供下拉菜单,为用户当前的输入提供自动完成选项。但有时建议项是通过请求后端得到的。可以在实现提示文本时应用防抖,在等待用户停止输入一段时间后再显示建议文本。因此,在每次击键时,都会等待几秒钟,然后再给出建议。

    (2)消除resize事件处理程序的抖动。

    window 触发 resize 的时候,不断的调整浏览器窗口大小会不断触发这个事件,用防抖让其只触发一次

    (3)自动保存

    例如掘金一类的网站,都会内嵌文本编辑器,在编辑过程中会自动保存文本,防止数据丢失。每次保存都会与后端进行数据交互,所以可以应用防抖,在用户停止输入后一段时间内再自动保存。

    (4)手机号、邮箱等输入验证检测

    通常对于一些特殊格式的输入项,我们通常会检查格式。我们可以应用防抖在用户停止输入后一段时间再进行格式检测,而不是输入框中内容发生改变就检测。

    (5)在用户停止输入之前不要发出任何 Ajax 请求

    二、节流(Throttle)

    节流:无论用户触发事件多少次,附加的函数在给定的时间间隔内只会执行一次。(即:回调函数在规定时间内最多执行一次)

    JavaScript防抖与节流怎么使用

     例如,当用户单击一个按钮时,会执行一个在控制台上打印Hello, world的函数。现在,假设对这个函数应用 1000 毫秒的限制时,无论用户点击按钮多少次,Hello, world在 1000 毫秒内都只会打印一次。节流可确保函数定期执行。

    2.1 节流函数的实现

    (1)版本1 —— 使用定时器
     const throttle = (func, limit) => {    let inThrottle;  // 是否处于节流限制时间内    return function() {        const context = this;        const args = arguments;        // 跳出时间限制        if (!inThrottle) {            func.apply(context, args);  // 执行回调            inThrottle = true;              // 开启定时器计时            setTimeout(() => inThrottle = false, limit);        }    }}
    (2)版本2 —— 计算当前时间与上次执行函数时间的间隔
      function throttle(func, limit) {    //上次执行时间    let previous = 0;    return function() {        //当前时间        let now = Date.now();        let context = this;        let args = arguments;        // 若当前时间-上次执行时间大于时间限制        if (now - previous > limit) {            func.apply(context, args);            previous = now;        }    }}

    很多现有的库中已经实现了防抖函数和节流函数

    2.2 节流的实际应用

    (1)游戏中通过按下按钮执行的关键动作(例如:射击、平A)

    拿王者荣耀为例,通常都有攻速一说。如果攻速低,即使 n 毫秒内点击平A按钮多次,也只会执行一次平A。其实这里就类似于节流的思想,可以通过设置节流的时间间隔限制,来改变攻速。

    (2)滚动事件处理

    如果滚动事件被触发得太频繁,可能会影响性能,因为它包含大量视频和图像。因此滚动事件必须使用节流

    (3)限制mousemove/touchmove事件处理程序

    小结

    如何选择防抖和节流:

    关于防抖函数和节流函数的选择,一篇博客中是这样建议的:

    A debounce is utilized when you only care about the final state. A throttle is best used when you want to handle all intermediate states but at a controlled rate.

    即:如果只关心最终状态,建议使用防抖。如果是想要函数以可控的速率执行,那么建议使用节流。

    延时多久合理:

    • 大多数屏幕的刷新频率是每秒60Hz,浏览器的渲染页面的标准帧率也为60FPS,浏览器每秒会重绘60次,而每帧之间的时间间隔是DOM视图更新的最小间隔。

    • 一个平滑而流畅的动画,最佳的循环间隔即帧与帧的切换时间希望是 16.6ms(1s/60)内,也意味着17ms内的多次DOM改动会被合并为一次渲染。

    • 当执行回调函数时间大于16.6ms(系统屏幕限制的刷新频率),UI将会出现丢帧(即UI这一刻不会被渲染),且丢帧越多,引起卡顿情况更严重。

    JavaScript防抖与节流怎么使用

    感谢各位的阅读,以上就是“JavaScript防抖与节流怎么使用”的内容了,经过本文的学习后,相信大家对JavaScript防抖与节流怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: JavaScript防抖与节流怎么使用

    本文链接: https://www.lsjlt.com/news/330173.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • JavaScript防抖与节流怎么使用
      这篇文章主要讲解了“JavaScript防抖与节流怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript防抖与节流怎么使用”吧!前言:防抖(Debounce) ...
      99+
      2023-06-30
    • 浅谈JavaScript节流与防抖
      目录节流与防抖概念:区别节流实现节流函数防抖实现防抖函数防抖升级版总结 节流与防抖概念:区别节流实现节流函数防抖实现防抖函数防抖升级版总结 节流与防抖 背景:当我们频繁去请求资源、接...
      99+
      2024-04-02
    • JavaScript 防抖debounce与节流thorttle
      目录一、防抖(Debounce)1.1 防抖函数的实现(1)版本1 —— 停止触发事件n毫秒后执行回调函数(2)版本21.2 防抖的实际应用(1)搜索框建议项...
      99+
      2024-04-02
    • JavaScript防抖与节流详解
      目录防抖debounce节流throttle总结防抖debounce 定义:对于短时间内连续触发的事件,比如滚动事件,防抖就是让某个时间期限内,事件处理函数只执行一次。 关于防抖,...
      99+
      2024-04-02
    • 什么是JavaScript的防抖与节流
      目录一、函数防抖(debounce) 1. 什么是防抖? 二、函数节流 2.1 定时器实现 2.2 时间戳实现 2.3 时间戳+定时器 一、函数防抖(debounce) 1. 什么...
      99+
      2024-04-02
    • JavaScript防抖动与节流处理
      针对一些会频繁触发的事件如scroll、resize,如果正常绑定事件处理函数的话,有可能在很短的时间内多次连续触发事件,十分影响性能。 因此针对这类事件要进行防抖动或者节流处理 防...
      99+
      2024-04-02
    • JavaScript节流与防抖实例分析
      本篇内容主要讲解“JavaScript节流与防抖实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript节流与防抖实例分析”吧!一、js防抖和节流在进行窗口的resize、sc...
      99+
      2023-06-29
    • JavaScript中函数的防抖与节流怎么应用
      本文小编为大家详细介绍“JavaScript中函数的防抖与节流怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript中函数的防抖与节流怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一...
      99+
      2023-06-29
    • JavaScript深入理解节流与防抖
      目录一、js防抖和节流二、为什么滚动scroll、窗口resize等事件需要优化三、滚动和页面渲染前端性能优化的关系四、防抖Debounce1 防抖Debounce情景2 防抖原理3...
      99+
      2024-04-02
    • JavaScript如何实现防抖与节流
      这篇文章主要介绍了JavaScript如何实现防抖与节流,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概念防抖:点击N次提交按钮,只有最后一次会发出请求。减少无效请求的次数。...
      99+
      2023-06-29
    • Vue防抖和节流怎么使用
      这篇文章主要介绍“Vue防抖和节流怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue防抖和节流怎么使用”文章能帮助大家解决问题。1. 观察者 防抖我们先从一个简单的组件开始,我们的任务是 ...
      99+
      2023-07-05
    • JavaScript防抖动与节流如何处理
      今天小编给大家分享一下JavaScript防抖动与节流如何处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。针对一些会频繁触...
      99+
      2023-07-02
    • Javascript的防抖和节流方法怎么用
      本篇内容主要讲解“Javascript的防抖和节流方法怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript的防抖和节流方法怎么用”吧!1. 什么是防抖【解释】: 防...
      99+
      2023-06-29
    • Vue防抖与节流的使用介绍
      目录概念1. 防抖2. 节流策略Vue中的使用概念 1. 防抖 防抖策略(debounce):是当事件被触发后,延迟n秒后再执行回调函数,如果在这n秒内事件被再次触发,则重新计时. ...
      99+
      2022-12-21
      Vue节流 Vue防抖
    • 怎么理解javascript中防抖和节流
      本篇内容介绍了“怎么理解javascript中防抖和节流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
      99+
      2024-04-02
    • JavaScript的防抖和节流怎么实现
      这篇文章主要介绍了JavaScript的防抖和节流怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript的防抖和节流怎么实现文章都会有所收获,下面我们一起来看看吧。1. 前言首先来举个例子。...
      99+
      2023-06-29
    • JavaScript 防抖和节流详解
      目录防抖节流总结防抖 自动门感应到有人,打开门,并且开始5秒倒计时,在 5 s 内有另外一个人靠近到门,门感应到人,重新5秒倒计时 当事件被触发时,设定一个延迟,若期间事件又被触发...
      99+
      2024-04-02
    • javascript的防抖和节流是什么
      这篇文章将为大家详细讲解有关javascript的防抖和节流是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:为什么需要防抖与节流 防抖和节流都是为了解决短时间内大量触发某函数或者事件而导...
      99+
      2023-06-28
    • JavaScript中函数的防抖与节流详解
      目录一、函数的节流1.1 定义1.2 解决方法1.3 案例演示1.3 .1  代码演示1.3 .2  运行结果1.3 .3  添加函数节流操作1.3 ....
      99+
      2024-04-02
    • Vue中使用防抖与节流的方法
      目录何为防抖/节流防抖(debounce)节流(throttle)页面使用使用场景总结何为防抖/节流 首先先说说何为防抖与节流 防抖(debounce) 防抖就是一段时间内会多次触发...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作