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

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

前戏


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


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


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


2.png


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


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


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


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


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


<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>


实现的效果如下:


1.png


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


新需求


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


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


实现节流


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


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,如果是,则执行输出逻辑;如果否,则清除原先的延时器,重新计算延时时间;


运行效果如下:


0.png


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


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


~ 本文完


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


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


13.png



相关文章
|
5天前
|
JavaScript
鼠标事件(点击换色)分别使用js和jQuery代码实现
鼠标事件(点击换色)分别使用js和jQuery代码实现
12 1
|
9天前
|
JavaScript 前端开发 UED
JS 防抖与节流
防抖和节流是优化高频事件处理的技术。针对如`scroll`、`resize`等频繁触发的事件,它们能有效减少不必要的回调执行,节省资源。防抖确保在一段时间内仅执行最后一次操作,适用于输入框自动补全等场景;而节流则按固定间隔执行函数,适合拖拽、滚动事件。通过简单的JavaScript实现,可以显著提升应用性能和用户体验。
15 1
JS 防抖与节流
|
1天前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
|
2天前
|
JavaScript 前端开发 iOS开发
优秀的JavaScript代码技巧大分享
优秀的JavaScript代码技巧大分享
12 3
|
2天前
|
JavaScript 前端开发 测试技术
编写高质量JavaScript代码怎么做
编写高质量JavaScript代码怎么做
11 2
|
5天前
|
前端开发 JavaScript 程序员
聊聊前端 JavaScript 的扩展运算符 “...“ 的使用场景
聊聊前端 JavaScript 的扩展运算符 “...“ 的使用场景
|
5天前
|
前端开发 JavaScript 程序员
前端 JavaScript 的 _ 语法是个什么鬼?
前端 JavaScript 的 _ 语法是个什么鬼?
|
5天前
|
JavaScript
JS九行代码实现1~10猜数字游戏
JS九行代码实现1~10猜数字游戏
11 0
|
5天前
|
前端开发 JavaScript
前端 JavaScript 与 HTML 怎么实现交互
前端 JavaScript 与 HTML 怎么实现交互
|
5天前
|
前端开发
前端代码书写规范
【8月更文挑战第15天】前端代码书写规范
11 0

热门文章

最新文章