前端防抖和节流

2023-09-18 17:59:14

前端防抖和节流

概述

防抖: 防止抖动,个人字面理解此处防的不是页面的抖动,而是用户手抖。为了防止用户快速且频繁的触发事件而导致多次执行事件函数,这样的场景有很多,比如监听滚动、鼠标移动事件onmousemove、频繁点击表单的提交按钮等等。
节流: 节约流量,为了节约流量,页面在一个时间周期内,只触发一次动作。所以节流的目的时稀释函数的执行频率。
防抖动和节流本质是不一样的。防抖动是多次触发但只会执行一次,节流是多次触发但周期内只会执行一次

防抖实现

<html>

<body>
    <input type="button" id = "btn" value="提交" />
    <ul id="result"></ul>
    <script>

        var resultText = ""
        const print = (text) => {
            let item = document.createElement('li')
            item.innerText = text
            document.getElementById("result").appendChild(item)
        }
        // 创建debounce防抖函数
        const debounce = (func, wait) => {
            let timeout = null;
            // 此时func的this指向是window
            // 如果func内部想修改this指向当前函数的调用者,就必须存储this,之后借助apply修改func的this指向。
            // 因此借助闭包缓存调用者的this
            let context = null; 
            
            let args = null;
            // 通过定时器延迟执行事件函数
            let run = () => {
                timeout = setTimeout(() => {
                    // 通过 apply 修改func的this指向,并让func获取真正的事件函数(即防抖函数return出来的函数)的参数,之后执行func
                    func.apply(context, args);
                    timeout = null
                }, wait);
            }

            // 清除定时器
            let clean = () => {
                clearTimeout(timeout);
            }

            return function () {
                context = this; // 谁调用函数(这里的函数是防抖函数return出来的函数),this就指向谁。
              
                args = arguments; // arguments 是一个对应于传递给函数的参数的类数组对象,可以获取函数的参数(这里的函数是防抖函数return出来的函数)。
                console.log(args)
                if (timeout) {
                    print('重置定时器');
                    clean();
                    run();

                } else {
                    print('开启新的定时器');
                    run();
                }
            }
        }

        // 要执行的事件函数
        const handleSubmit = (e) => {
            print('提交表单', e);
        }

        const fn1 = debounce(handleSubmit, 1500)

        document.getElementById("btn").addEventListener("click", fn1)
    </script>
</body>

</html>

节流实现

<html>

<body>
    <input type="button" id="btn" value="提交" />
    <ul id="result"></ul>
    <script>

        var resultText = ""
        const print = (text) => {
            let item = document.createElement('li')
            item.innerText = text
            document.getElementById("result").appendChild(item)
        }
        const throttle = (func, wait) => {

            let timeout = null;

            return function () {
                let context = this;
                let args = arguments;
                if (!timeout) {
                    timeout = setTimeout(() => {
                        timeout = null;
                        func.apply(context, args);
                    }, wait)

                }
            }
        }

        // 要执行的事件函数
        const handleSubmit = (e) => {
            print('提交表单', e);
        }

        const fn1 = throttle(handleSubmit, 1500)

        document.getElementById("btn").addEventListener("click", fn1)
    </script>
</body>

</html>
更多推荐

虹科分享 | 谷歌Vertex AI平台使用Redis搭建大语言模型

文章来源:虹科云科技点此阅读原文基础模型和高性能数据层这两个基本组件始终是创建高效、可扩展语言模型应用的关键,利用Redis搭建大语言模型,能够实现高效可扩展的语义搜索、检索增强生成、LLM缓存机制、LLM记忆和持久化。有Redis加持的大语言模型可应用于文档检索、虚拟购物助手、客户服务助理等,为企业带来益处。一、语言

服务器的架构有哪些

服务器的架构有哪些1、单体架构软件设计经典的3层模型是表现层,业务逻辑层,数据访问层。典型的单体架构就是将所有的业务场景的表现层,业务逻辑层,数据访问层放在一个工程中最终经过编译,打包,部署在一台服务器上。2、垂直架构垂直架构是将一个大项目,按照业务场景纵向拆分为互不相干的单体架构的项目。3、前后端分离前后端分离是横向

近年来国内室内定位领域硕士论文选题的现状与趋势

目录一、前言二、选题的目的和意义三、选题现状分析四、选题趋势分析一、前言本博文采用了图表统计法分析了近5年来100余篇高被引室内定位领域硕士论文选题的现状,并从选题现状中得出了该领域选题的大致趋势。本文还通过分析该领域硕士毕业论文选题的现状和趋势,对未来该领域选题提出了自己的见解和展望。二、选题的目的和意义无论是大学生

成为威胁:网络安全中的动手威胁模拟案例

不断变化的网络威胁形势要求组织为其网络安全团队配备必要的技能来检测、响应和防御恶意攻击。然而,在研究中发现并继续探索的最令人惊讶的事情是,欺骗当前的网络安全防御是多么容易。防病毒程序建立在庞大的签名数据库之上,只需更改程序内的文本这样简单的操作就很容易崩溃。这同样适用于网络签名以及端点检测和响应。防御技术主要关注某些行

区块链安全,哈希函数暴露的攻击向量与对策

区块链安全,哈希函数暴露的攻击向量与对策简介LengthExtensionAttack是一种与某些特定类型的哈希函数(如MD5,SHA-1和SHA-2)的特性有关的攻击。简单来说,这种攻击利用了一个事实,即知道H(message)和message的长度,我们可以轻松计算出H(message||padding||exte

QTday3

#include"widget.h"Widget::Widget(QWidget*parent):QWidget(parent){this->setFixedSize(600,450);//将窗口固定大小this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));//设置窗口图

驱动开发---基于gpio子系统编写LED灯的驱动

一、GPIO子系统相关API1.解析GPIO相关的设备树节点structdevice_node*of_find_node_by_path(constchar*path)功能:根据设备树节点路径解析设备树节点信息参数:path:设备树所在的节点路径/mynode@0X12345678返回值:成功返回目标节点首地址,失败返

第33节——useRef

一、概念useRef,他的作用是“勾住”某些组件挂载完成或重新渲染完成后才拥有的某些对象,并返回该对象的引用。该引用在组件整个生命周期中都固定不变,该引用并不会随着组件重新渲染而失效。返回一个可变的ref对象,该对象只有个current属性,初始值为传入的参数(initialValue)。返回的ref对象在组件的整个生

【ROS】机器人使用Nomachine进行远程控制

官网:NoMachine-FreeRemoteDesktopforEverybody支持的系统:WindowsMacLinux树莓派其他ARM板IOSAndroid由于网速问题,可以使用我下载好的:(8.8.1_1)链接:https://pan.baidu.com/s/16v6jn8a-dcVbIxGI3bI2QA提取

60+开源数据集资源大合集(医学图像、卫星图像、语义分割、自动驾驶、图像分类等)

1.医学图像疟疾细胞图像数据集下载链接:http://suo.nz/2VQTUt皮肤癌MNIST:HAM10000下载链接:http://suo.nz/33n6Xy该数据集收集了来自不同人群的皮肤镜图像,通过不同的方式获取和存储。最终数据集包含10015张皮肤镜图像,可用作学术机器学习目的的训练集。案例包括色素病变领域

记一次 Java Testcontainers CPU 100% 问题排查过程

以为代码进入了死循环,结果并没有!文章目录背景与问题排查过程代码路经确认内存分析咨询okio社区等等,好像并没有死循环能否从内存快照发现其他问题?背景与问题本问题来源于ShardingSphereissue:Integrationtestsoccasionallystuckinwaitingforcontainerre

热文推荐