码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 前端基础:防抖与节流


    一、一种现象

    有一个input框,每次输入都要触发一次change事件,其实这大可不必,比如我输入 “上海” 两个字,竟然触发了9次。

    1. <body>
    2. <input type="text" />
    3. <script src="./t.js"></script>
    4. </body>
    1. const input = document.querySelector('input')
    2. input.oninput = function() {
    3. console.log(this.value)
    4. }

     假如每次change都会和后端发生一次交互,这个性能就会很惨。

    怎么才能让这个次数变的少?

    二、防抖

    用户触发事件过于频繁,只要最后一次事件的操作。比如我们可以设置500ms,只要在500ms内你一直还在输入,也就是说你的停顿是少于500ms的,那么就不触发change事件里的复杂逻辑。在执行复杂逻辑之前就把定时器清理掉。

    1. const input = document.querySelector('input')
    2. let t = null
    3. input.oninput = function() {
    4. if (t !== null) {
    5. clearTimeout(t)
    6. }
    7. t = setTimeout(() => {
    8. // 用一句打印代替复杂的业务逻辑
    9. console.log(this.value)
    10. }, 500)
    11. }

    三、代码改进

    上面的代码有2个大毛病:

    1. let t是个全局变量;
    2. 防抖的逻辑 if (t !== null) 和 业务逻辑都混在一起了。

    用闭包来改进这段代码

    上面,在调用debounce的时候,第一个参数是传递一个函数,

    我们传的是一个() => {console.log(this.value)} ,这里的this是window,但是我们想要的是input。

    所以,可以用call的方式来

    1. const input = document.querySelector('input')
    2. input.oninput = debounce(function() { // 这里如果用箭头函数,还是指向window,不能用箭头函数
    3. // 业务逻辑,用一个打印代替
    4. console.log(this.value)
    5. }, 500)
    6. function debounce(fn, delay) {
    7. let t = null
    8. return function() {
    9. if (t !== null) {
    10. clearTimeout(t)
    11. }
    12. t = setTimeout(() => {
    13. // 执行业务逻辑,这里的this就是input 事件对象
    14. console.log('this: ', this)
    15. fn.call(this)
    16. }, delay)
    17. }
    18. }

    四、节流

    有一种情形,滚动事件,会执行很多次。

    1. window.onscroll = function() {
    2. console.log('---------')
    3. }

     你看,不到一秒钟随便滚动一下就是100多次。

    防抖:只执行最后一次;

    节流:控制执行次数;让耗性能的方法减少执行次数;

    和防抖是一样的写法

    1. window.onscroll = throttle(() => {
    2. // 这里是业务逻辑,this:window
    3. console.log('..........')
    4. }, 500)
    5. function throttle(fn, delay) {
    6. let flag = true
    7. return function() {
    8. if (flag) {
    9. setTimeout(() => {
    10. fn.call(this)
    11. flag = true
    12. }, delay)
    13. }
    14. flag = false
    15. }
    16. }

     

  • 相关阅读:
    1. 堪比JMeter的.Net压测工具 - Crank 入门篇
    高教社杯数模竞赛特辑论文篇-2023年E题:基于小波变换和背包模型的小浪底水库最优监测方案研究(附获奖论文及Python代码实现)
    第三章:SQL优化【mysql数据库-进阶】
    (附源码)计算机毕业设计SSM基于的开放式实验室预约系统
    java计算机毕业设计疆域特色农家乐系统MyBatis+系统+LW文档+源码+调试部署
    “查找”学习提纲(三)——总结
    Windows 程序安装与更新方案: Clowd.Squirrel
    网络正常,微信正常登录,谷歌浏览器无法正常打开(100%解决)
    Spring Boot 文件上传 报错:FileNotFoundException Spring 异步文件上传 FileNotFoundException
    Oracle 平均数详解(avg)
  • 原文地址:https://blog.csdn.net/GY_U_YG/article/details/125492220
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号