前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端 JavaScript 之『节流』的简单代码实现

前端 JavaScript 之『节流』的简单代码实现

原创
作者头像
编程三昧
修改于 2021-06-21 02:33:06
修改于 2021-06-21 02:33:06
4630
举报
文章被收录于专栏:编程三昧编程三昧

前戏

首先,总结一下上一篇文章——《前端 JavaScript 之『防抖』的简单代码实现》的内容:「防抖」就是在高频率触发事件停止触发后,延时执行某个处理逻辑。

防抖虽然在一定程度上对性能起到了优化效果,但是,我们也要看到它的局限性:如果高频率事件一直触发,那么回调函数中的逻辑就一直得不到执行。

大家都知道,掘金的编辑器带有草稿箱的效果,即你输入的内容会保存下来,即使我们退出编辑器页面了,再次进入还是可以找回前面输入的内容,这是因为编辑器的 input 事件中执行了发送内容的防抖函数。如下图所示:

现在假设:你的打字速度很快,基本上不带喘口气的,那么是否会导致很长时间都保存不了一次数据?如果这时候你再以迅雷不及掩耳之势关闭掉浏览器,是不是你所写的内容就保存不下来了?

那么我们是否可以想办法避免上面这种情况呢?

在这种需求背景下,我们今天的主人公——「节流」开始粉墨登场。

节流的含义大家应该都知道了:每隔固定的时间都会执行一次回函函数中的逻辑

不使用节流函数,我们来看一下下面这个功能的执行效果:

代码语言:txt
AI代码解释
复制
<body>
    <form action="" class="example-form">
        <div>
            <label for="name">
                名称
            </label>
            <input class="input-ele" type="text" name="name" id="name" placeholder="please input your name"
                autocomplete="off">
        </div>
        <div>
            <label for="res">
                输入
            </label>
            <textarea class="input-ele" type="multipart" name="res" id="res" readonly
                placeholder="这里是每一次输入的结果"></textarea>
        </div>
    </form>
</body>

<script>
    window.onload = () => {
        const inputEle = document.querySelector("#name");
        const resEle = document.querySelector("#res");
        inputEle.addEventListener("input", function (event) {
            console.log(this.value);
            resEle.value += `\n${ this.value }`
        });
    }
</script>

实现的效果如下:

即使我们想要执行输出逻辑,但是也不能接受这么高频率的输出,一个是造成了输出内容冗余,二是渲染强度高,不太划算。

新需求

假如,现在有这么一个新需求,要我们在 input 事件中加入新的逻辑:每隔一段时间后,都会执行一次回调函数中的逻辑。

这个需求是不是挺符合节流函数的使用场景的,那我们赶紧来实现一个吧。

实现节流

根据节流函数的定义:以固定的低频率执行代码逻辑,具体到我们上面的额需求来说,只要打开页面,不管你有没有输入,都会每隔几秒就执行一次保存数据的逻辑。

代码语言:txt
AI代码解释
复制
window.onload = function () {
    const resEle = document.querySelector("#res");
    function changeOutputVal(value) {
        resEle.value += `\n${ value }`;
    }
    function throttle(fun, delay) {
        let last, deferTimer
        return function (args) {
            let that = this;
            let _args = arguments;

            let now = +new Date();
            if (last && now < last + delay) {
                clearTimeout(deferTimer);
                deferTimer = setTimeout(function () {
                    last = now;
                    fun.apply(that, _args);
                }, delay)
            } else {
                last = now;
                fun.apply(that, _args);
            }
        }
    }
    const outputRes = throttle(changeOutputVal, 2000);

    const inputEle = document.querySelector("#name");

    inputEle.addEventListener("input", (eve) => {
        outputRes(eve.target.value);
    });
}

代码说明:

  • 每一次事件被触发,都会判断间隔时间是否大于等于 delay,如果是,则执行输出逻辑;如果否,则清除原先的延时器,重新计算延时时间;

运行效果如下:

可以看到,在加入节流代码之后,输出事件不会每次 input 事件都触发,而是每隔 delay 时间触发一次。

~

~

代码比较粗糙,也比较基础,后面会逐步向着复杂的方向迭代,望各位看官海涵🙏

~

~

~ 本文完

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好!我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

mianshi
mianshi

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端 JavaScript 之『节流』的简单代码实现
首先,总结一下上一篇文章——《前端 JavaScript 之『防抖』的简单代码实现》的内容:「防抖」就是在高频率触发事件停止触发后,延时执行某个处理逻辑。
编程三昧
2021/06/19
5330
前端 JavaScript 之『节流』的简单代码实现
(鸡汤文)这一次我终于搞懂了 JavaScript 定时器的 this 指向!
忽然有一种感觉,每次学习一个知识点就像是谈一场恋爱:从初次邂逅,到彼此了解,一切都那么的符合恋爱的过程!
编程三昧
2021/06/20
3160
(鸡汤文)这一次我终于搞懂了 JavaScript 定时器的 this 指向!
详谈js防抖和节流
函数防抖是某一段时间内只执行一次;而函数节流是间隔时间执行,不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数。
前端林子
2018/10/20
5.6K1
详谈js防抖和节流
JavaScript 高频函数优化-函数防抖&函数节流
什么是高频函数? oninput(实时获取输入的数据) onscroll(监听页面的滚动) onresize(监听浏览器可视区域的变化) onmousemove(移动端监听手指在屏幕的滑动) 什么是函
前端小tips
2021/11/24
3870
JavaScript 高频函数优化-函数防抖&函数节流
Javascript 防抖和节流
概念 防抖:就是一定时间内,只会执行最后一次任务; 节流:就是一定时间内,只执行一次 ; 先看一个例子(上代码): //模拟 ajax 请求 function ajax(content) { console.log('ajax request ' + content) } let inputa = document.getElementById('unDebounce') inputa.addEventListener('keyup', function (e) { ajax(e.targe
编程内马尔
2022/11/15
3910
Javascript 防抖和节流
防抖和节流 原
浏览器的一些事件,如:resize,scroll,keydown,keyup,keypress,mousemove等。这些事件触发频率太过频繁,绑定在这些事件上的回调函数会不停的被调用。会加重浏览器的负担,导致用户体验非常糟糕,不知哪个大神发明了防抖和节流,用来控制回调函数的次数。
tianyawhl
2019/04/04
7750
前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述
作为一名资深搬砖工,你要问我用得最熟练的技能是什么,那我敢肯定且自豪的告诉你:是 Ctrl+C !是 Ctrl+V!
编程三昧
2021/06/22
1.9K0
前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述
7分钟理解JS的节流、防抖及使用场景前言概念和例子总结拓展
据说阿里有一道面试题就是谈谈函数节流和函数防抖。 糟了,这可触碰到我的知识盲区了,好像听也没听过这2个东西,痛定思痛,赶紧学习学习。here we go!
用户2356368
2019/04/03
8960
7分钟理解JS的节流、防抖及使用场景前言概念和例子总结拓展
js的函数节流、函数防抖及其使用场景
先说函数防抖,他的使用场景最多是在搜索时使用,比如百度的搜索,你在输入文字后的一段时间内开始自动搜索而不是每次按下键都执行一次搜索。因为如果每次按键都搜索,则会消耗大量的服务器资源。
OECOM
2020/07/02
8930
基于前端的计时器工具:实现与优化
在前端开发中,计时器是一个常见的工具,广泛应用于倒计时、定时任务、间隔刷新等场景。本文将介绍如何在前端实现一个通用的计时器工具,并通过实例深入探讨其优化和应用。
一键难忘
2024/10/12
7171
JS 防抖与节流
如:浏览器的 resize、scroll、keypress、mousemove 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能
心安事随
2024/07/29
1240
JS 防抖与节流
JavaScript网页性能优化(函数防抖与函数节流)
b.输入框事件:验证手机号或者邮箱,用户输入时不断触发键盘事件,应该等用户结束输入之后,以最后一次输入为准
帅的一麻皮
2020/05/16
1.5K0
带你“深入”节流
比如说吃饭。吃饭说明规定,五个小时吃一次。吃了一次饭,小狗蹦蹦哒哒地玩了五个小时。五个小时一到, 小狗再回来吃饭。依次类推,每五小时回来吃一次饭。
ClyingDeng
2023/03/04
7300
带你“深入”节流
简单复习下什么是JavaScript的防抖和节流
使用场景:click、onMouseOver,onMouseMove,resize,input,scroll等
前端达人
2021/06/16
5410
js防抖和节流实现
1. 防抖(debounce):触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间 举例:就好像在百度搜索时,每次输入之后都有联想词弹出,这个控制联想词的方法就不可能是输入框内容一改变就触发的,他一定是当你结束输入一段时间之后才会触发。  2.节流(throttle):高频事件触发,但在 n 秒内只会执行一次,所以节流会稀释函数的执行频率 举例:预定一个函数只有在大于等于执行周期时才执行,周期内调用不执行。就好像你在淘宝抢购某一件限量热卖商品时,你不断点刷新点购买,可是总有一段时间你点上是没有效果,这里就用到了节流,就是怕点的太快导致系统出现bug。
蓓蕾心晴
2022/08/19
6530
JavaScript手写防抖和节流函数
🤓防抖 函数防抖是指在事件被触发n秒后再执行回调,如果在这n秒内事件又被触发 ,则重新计时。这可以使用在一些点击请求的事件,避免因用户的多次点击向后端发送多次请求。 应用场景 按钮提交场景:防止多次提交按钮,只执行最后提交的一次 服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次还有搜索联想词功能类似生存环境请用lodash.debounce 代码实现 function debounce(fn,wait){ let timer=null; return function(){
henu_Newxc03
2022/05/05
3890
js防抖节流
由于节流和防抖函数的实现都用到了闭包,所以在了解节流和防抖之前先简单介绍下什么是闭包。
hss
2022/02/25
3.1K0
js防抖节流
前端高薪必会的JavaScript重难点知识:防抖与节流详解
今天为大家带来一篇JS重难点的知识体系,这也是前端高薪必备的重难点知识,而且防抖与节流在各大企业前端面试过程中经常会考到的高频面试题!
艾编程
2022/12/14
2.1K0
前端高薪必会的JavaScript重难点知识:防抖与节流详解
函数节流与函数防抖
函数节流与函数防抖的目的都是为了减少用户对服务器不必要的请求次数,以此提高服务器性能的函数。节流是在一段时间内,只向服务器请求一次。防抖则是在频繁触发相同请求时,若任务之间间隔小于指定时间,那么只会执行最后一次请求。
_kyle
2020/08/22
5530
节流防抖的使用_监听滚动节流
当事件被触发后,延迟几秒后再执行回调,如果在这几秒内事件又被触发,则重新计时。如:游戏中的回城机制,中途打断后必须要重新回城,重新读条。
全栈程序员站长
2022/11/18
9270
推荐阅读
相关推荐
前端 JavaScript 之『节流』的简单代码实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档