首页 > 编程语言 >JavaScript防抖与节流的运用

JavaScript防抖与节流的运用

时间:2025-01-16 14:32:45浏览次数:3  
标签:function ... 防抖 节流 JavaScript delay func 执行 函数

防抖(Debounce)

  • 概念
    • 防抖是指在事件被触发 n 秒后再执行回调,如果在这 n 秒内又被触发,则重新计时。防抖的主要目的是将多次连续触发的事件合并为一次执行,适用于例如输入框输入搜索内容时,避免频繁发送请求,只在用户停止输入一段时间后才发送请求。
  • 实现思路
    1. 创建一个定时器。
    2. 当事件触发时,清除之前的定时器。
    3. 重新创建一个新的定时器,在指定延迟时间后执行回调函数。
function debounce(func, delay) {
    let timer;
    return function (...args) {
        clearTimeout(timer);
        timer = setTimeout(() => {
            func.apply(this, args);
        }, delay);
    };
}

// 示例
function handleInput() {
    console.log('执行输入操作');
}

const debouncedHandleInput = debounce(handleInput, 300);

document.getElementById('input').addEventListener('input', debouncedHandleInput);

代码解释:

  • debounce 函数接收两个参数:
    • func:需要执行的回调函数。
    • delay:延迟时间(以毫秒为单位)。
  • let timer;:存储定时器的变量。
  • return function (...args) {...}:返回一个新的函数,当事件触发时调用。
    • clearTimeout(timer);:清除之前的定时器。
    • timer = setTimeout(() => {...}, delay);:创建一个新的定时器,在 delay 毫秒后执行 func 函数。

 

节流(Throttle)

  • 概念
    • 节流是指在一定时间内只允许函数执行一次。例如滚动事件,防止在滚动过程中频繁触发回调函数,影响性能。
  • 实现思路
    1. 记录上次执行时间。
    2. 当事件触发时,检查当前时间与上次执行时间的差。
    3. 如果超过指定时间间隔,执行回调函数并更新上次执行时间。
function throttle(func, delay) {
    let lastCall = 0;
    return function (...args) {
        const now = new Date().getTime();
        if (now - lastCall < delay) {
            return;
        }
        lastCall = now;
        return func(...args);
    };
}

// 示例
function handleScroll() {
    console.log('执行滚动操作');
}

const throttledHandleScroll = throttle(handleScroll, 200);

window.addEventListener('scroll', throttledHandleScroll);

代码解释:

  • throttle 函数接收两个参数:
    • func:需要执行的回调函数。
    • delay:时间间隔(以毫秒为单位)。
  • let lastCall = 0;:存储上次执行函数的时间。
  • return function (...args) {...}:返回一个新的函数,当事件触发时调用。
    • const now = new Date().getTime();:获取当前时间。
    • if (now - lastCall < delay) {...}:如果距离上次执行时间小于 delay 毫秒,不执行函数。
    • lastCall = now;:更新上次执行时间。

运用场景

  • 防抖
    • 搜索框输入搜索。
    • 窗口大小调整时重新计算布局。
    • 按钮点击时发送请求。
  • 节流
    • 滚动事件处理。
    • 鼠标移动事件处理。

标签:function,...,防抖,节流,JavaScript,delay,func,执行,函数
From: https://blog.csdn.net/Z09111616/article/details/145142145

相关文章

  • 必知必会!JavaScript 开发中的反模式与避坑指南
    一、开发“雷区”:JavaScript反模式危机四伏JavaScript作为软件开发领域的多面手,在Web前端、后端乃至移动端开发中均占据着举足轻重的地位。然而,在实际的开发过程中,众多反模式如同隐藏在暗处的陷阱,时刻威胁着开发的顺利进行。这些反模式的产生,源于JavaScript灵活的语法......
  • 实现网页倒计时跳转的JavaScript代码
    在网页开发中,倒计时跳转功能常用于广告页面、活动倒计时或页面跳转提示等场景。下面是一个简单的JavaScript实现,用于在指定时间后自动跳转到另一个页面。该代码会在页面上显示倒计时,并在倒计时结束后跳转到指定的URL。代码实现<spanclass="time"></span><script>var......
  • a标签下的href="javascript:void(0)"起到了什么作用?说说你对javascript:void(0)的理解
    在前端开发中,a标签通常用于创建链接,其href属性指定了链接的目标地址。然而,有时我们可能希望创建一个看起来像链接的元素,但实际上并不导航到任何其他页面或重新加载当前页面。这时,href="javascript:void(0)"就派上了用场。javascript:void(0)的作用主要是阻止链接的默认行为......
  • JavaScript中new操作符具体做了什么?手写new操作符
    做了什么?1.创建一个空的对象2.将空对象的原型指向构造函数的原型3.将空对象作为构造函数的上下文(改变this指向)4.对构造函数返回代码functionFoo(){console.log(this);this.name="张三";return[1,2,3];}constf=newFoo();console.log(f);//空对象......
  • 【Javascript Day6】for循环练习及数组
    目录for循环练习数组1.构造数组2.字面量数组创建3.数组的遍历循环4.length的使用规则for循环练习按输入弹窗行数画菱形(奇偶皆可)varpro=prompt("请输入行数")varsum="";for(vari=1;i<=pro;i++){if(i<=parseInt((pro*1+1)/2)......
  • JavaScript ——节点操作
    节点操作1.创建节点document.createElement('节点')参数:标签名字符串。说明:这些元素原先不存在,是根据需求动态生成的,因此也称为动态创建元素节点。该方法会将创建好的对象作为返回值返回。2.创建文本document.createTextNode() 可以用来创建一个文本节点对象。参数:文......
  • JavaScript详解 ——函数
    1、函数的概念在JS里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码需要大量重复使用函数:就是封装一段可被重复调用执行的代码块。通过代码块可以实现在需要的的重复使用,使用typeof检查一个函数对象时,会返回function函数的封装是把一个或者多个功能通过函数的方式......
  • vue指令-防抖
     //1.设置v-throttle自定义指令Vue.directive('throttle',{bind:(el,binding)=>{letthrottleTime=binding.value;//防抖时间if(!throttleTime){//用户若不设置防抖时间,则默认2sthrottleTime=2000;}letcbFun;el.addEvent......
  • JavaScript基础01
    一、基本情况#1、介绍JavaScript是一门解释性的脚本语言,主要用来给HTML网页增加动态功能。通常的js是运行在浏览器环境下的,可以帮助我们去控制页面,实现丰富的功能。会有dom和bom的api去操作html文档和浏览器的一些功能。nodejs是运行在计算机环境下的。语法一样,但是因为环......
  • python bs4 selenium 查找a href=javascript:();的实际点击事件和url
    在使用BeautifulSoup和Selenium时,处理href="javascript:;"的链接需要一些额外的步骤,因为这些链接不直接指向一个URL,而是通过JavaScript代码来执行某些操作。这可能包括导航到另一个页面、触发模态窗口、显示/隐藏内容等。以下是如何使用Selenium来查找和处理这......