前端 JavaScript 之『防抖』的简单代码实现

简介: 经过上一篇文章的总结,我们知道:短时间内高频率地触发事件,可能会导致不良后果

前戏 🌰


经过上一篇文章的总结,我们知道:短时间内高频率地触发事件,可能会导致不良后果。


具体到我们开发界来说,如果数据一致处于一种高频率更新的状态,那么可能会引发的问题如下:


  • 前后端数据交互频率过高,导致流量浪费。
  • 界面高频率渲染更新,引发页面延迟、卡顿或假死等状况,影响体验。


在进入正题之前,我们先来看下面这个例子:


<form action="" class="example-form">
    <div>
        <label for="name">名称</label>
        <input type="text" 
               name="name" 
               id="name" 
               placeholder="please input your name"
         >
    </div>
    <div>
        <label for="res">输入</label>
        <textarea type="multipart" 
                  name="res" 
                  id="res" 
                  placeholder="这里是每一次输入的结果"
        ></textarea>
    </div>
</form>


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 }`
    });
}


14.png


在输入框的 input 事件中,将该输入框的当前值输出在多行文本框中。可以看到,每输入一个拼音字母,都会有一条输出记录,触发频率取决于人的打字速度。


新需求 🤬


假如,现在有这么一个新需求,要我们在 input 事件中加入新的逻辑:将输入框的当前值发往后台进行存储。


可以想象,这种情况下的前后端交互频率该有多高,其中很多数据都是没有必要即刻发送保存的,纯属浪费流量。


我们可以考虑对这个需求进行一下优化,只要控制一下交互频率就好,主要有以下两个方向:


  • 每隔几秒发送一次数据 —— 节流
  • 每当用户停止输入之后,开始计时,一定时间后发送一次数据 —— 防抖


实现防抖


首先,我们从防抖的方向进行实现:只有当用户停止输入一段时间后,才会将输入内容输出在多行文本框中。


window.onload = () => {
    const resEle = document.querySelector("#res");
    function changeOutputVal(value) {
        resEle.value += `\n${ value }`;
    }
    function debounce(fn, delay = 1000) {
        let timer = null;
        return function (...args) {
            console.log(args);
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
            timer = setTimeout(() => {
                fn.apply(this, args);
            }, delay);
        }
    }
    const outputRes = debounce(changeOutputVal, 1000);
    const inputEle = document.querySelector("#name");
    inputEle.addEventListener("input", (eve) => {
        outputRes(eve.target.value);
    });
}


代码说明:


  1. 每一次事件被触发,都会清除当前的 timer 然后重新设置超时调用,即重新计时。 这就会导致每一次高频事件都会取消前一次的超时调用,导致事件处理程序不能被触发;
  2. 只有当高频事件停止,最后一次事件触发的超时调用才能在delay时间后执行。


运行效果如下:


15.png


可以看到,在加入防抖代码之后,input 事件并不会每次输入都会输出在多行文本,而是会在用户停止输入 delay 时间之后触发输出,频率确实低了很多。从某种程度上来说,的确优化了页面显示效果,给人的视觉感受比较舒服。


总结


巧用防抖函数的,既可以优化性能,又能优化显示效果,一举两得。


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


~ 本文完


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


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


13.png




相关文章
|
2月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
2月前
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
1月前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
83 15
在 golang 中执行 javascript 代码的方案详解
|
2月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
1月前
|
缓存 监控 前端开发
探索前端性能优化:关键策略与代码实例
本文深入探讨前端性能优化的关键策略,结合实际代码示例,帮助开发者提升网页加载速度和用户体验,涵盖资源压缩、懒加载、缓存机制等技术。
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
59 5
|
2月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
85 1
|
2月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
58 4
|
2月前
|
Web App开发 缓存 监控
前端性能优化实战:从代码到部署的全面策略
前端性能优化实战:从代码到部署的全面策略
39 1
|
2月前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例