JavaScript防抖和节流

JavaScript防抖和节流

问题还原

我们先来通过代码把常见的问题还原:

<html>
<head>
    <meta charset="utf-8">
    <title>问题演示</title>
</head>
<body>

    <script type="text/javascript">
        window.onload = function(){
            // 没有处理防抖和节流的代码
            let norInput = document.getElementById(‘normal‘);

            let ajax = content=>{
                console.log(‘ajax:‘ + content);
            }

            norInput.addEventListener(‘keyup‘,e=>{
                ajax(e.target.value)
            })
            // console.log(debounce()())
        }
    </script>

    <input type="text" name="normal" id="normal">

</body>
</html>

在上面的程序中,看上去是没有什么问题,但是用户每输入一个字符,都会向后端发起一次请求,而这只是一个用户,如果同时很多用户进行相同的操作,无异于是给服务端造成极大的压力。

而解决这种问题,有很多种合适的方法,但是下文要说到的,是关于JavaScript当中的防抖节流操作。

防抖

什么是防抖

当用户在触发一次事件n秒后在执行回调函数,如果重复触发则进行重新计时。

根据防抖的逻辑,下面通过代码来进行模拟:

<html>
<head>
    <meta charset="utf-8">
    <title>问题演示</title>
</head>
<body>

    <script type="text/javascript">
        window.onload = function(){

            let norInput = document.getElementById(‘normal‘);
            // 创建一个函数模拟ajax请求
            let ajax = content=>{
                console.log(‘ajax:‘ + content);
            }

            // 创建防抖函数
            let debounce = (fn,delay) => {
                return function(args){
                    let that = this;
                    let param = args;
                    // 每次事件触发 清除当前的timmer 然后重写调用
                    clearTimeout(fn.id);
                    fn.id = setTimeout(function(){
                        fn.call(that,param)
                    },delay)
                }
            }

            let deb_func = debounce(ajax,500)
            norInput.addEventListener(‘keyup‘,e=>{
                deb_func(e.target.value)
            })

        }
    </script>

    <input type="text" name="normal" id="normal">

</body>
</html>

上面的demo运行后,你会发下,用户如果停止输入后的一段时间才会发起ajax请求,而如果用户持续输入,则计时器会不断的刷新,再这个过程中并不会发生请求,直到用户停止输入,才会开始计时,时间一到,才会发送请求。

这样就能够有效的减少因为频繁发送请求给服务器带来过大的压力。

使用场景

  1. resize 事件或者scroll事件等,可以通过防抖减少触发次数
  2. 用户在输入框中频繁输入

节流

什么是节流

设置一个时间范围,在一定的时间范围内,仅允许执行一次执行一次事件的回调函数,也就是说只要在规定时间范围内,无论事件触发几次,都只能执行一次回调函数。

我们通过click事件来还原下事故现场:

<html>
<head>
    <meta charset="utf-8">
    <title>节流</title>
</head>
<body>

<input type="button" id="btn" value="点击">
<script type="text/javascript">

let oBtn = document.getElementById(‘btn‘);

let ajax = ()=>{
    console.log("ajax发送请求")
}

oBtn.addEventListener(‘click‘,()=>{
    ajax();
})

</script>
</body>
</html>

当用户每一次点击后,都会发送一次请求,点击不断,请求不断。如同生命不息,战斗不止。可想而知,一旦有人无聊的一直点击,那么请求次数将会变得很可观。

下面是我们根据节流的原理来实现的示例代码:

<html>
<head>
    <meta charset="utf-8">
    <title>问题演示</title>
</head>
<body>

    <script type="text/javascript">
        window.onload = function(){
            // 获取元素
            let oBtn = document.getElementById(‘normal‘);

            // 模拟ajax请求
            let ajax = ()=>{
                console.log("ajax发送请求....")
            }

            // 节流函数
            let throttle = (func,wait) =>{
                var timeout ;
                var previous = 0;

                return function(){
                    var _this = this;
                    args = arguments;
                    if(!timeout){
                        timeout = setTimeout(function(){
                            timeout = null;
                            func.apply(_this,args);
                        },wait)
                    }
                }
            }
            let thro_func = throttle(ajax,3000);

            // 绑定事件
            oBtn.addEventListener(‘click‘,()=>{
                thro_func();
            })
        }
    </script>

    <input type="button" name="normal" id="normal" value="点击">

</body>
</html>

通过上面的案例,我们可以做到,当用户点击一次后,计时器开始,这当中无论发生几次事件触发,都仅仅会执行一次回调。

当然,想要实现节流的方法不止使用定时器这一种方案,还可以选择使用时间戳,再或者其他方法也不是不行,本文的目的仅仅是为了阐述和说明节流防抖这两种减少服务器压力的方法而已。

使用场景

  1. 鼠标不断点击的情况
  2. 页面无限加载,每隔一段时间发起请求而不是用户停止滚动发起请求
  3. ...

原文地址:https://www.cnblogs.com/jhflyfish/p/11639285.html

时间: 2024-10-08 12:57:43

JavaScript防抖和节流的相关文章

JavaScript 防抖和节流

1. 概述 1.1 说明 在项目过程中,经常会遇到一个按钮被多次点击并且多次调用对应处理函数的问题,而往往我们只需去调用一次处理函数即可.有时也会遇到需要在某一规则内有规律的去触发对应的处理函数,所以就需要使用到函数防抖与函数节流来帮助我们实现我们想要的结果以及避免不必要的问题产生. 1.2 函数防抖(debounce) 定义:当持续触发事件时(如连续点击按钮多此),一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,有一次触发了事件,就重新开始延时. 原理:维护一个计

来聊聊JavaScript中的防抖和节流

目录 JavaScript防抖和节流 问题还原 防抖 什么是防抖 使用场景 节流 什么是节流 使用场景 JavaScript防抖和节流 问题还原 我们先来通过代码把常见的问题还原: <html> <head> <meta charset="utf-8"> <title>问题演示</title> </head> <body> <script type="text/javascript&qu

javascript中的防抖与节流。

1.什么是防抖?它有什么作用? 什么是防抖?相信行入门的小白,甚至做了一段时间的程序员也不太理解是什么意思,我也是听了公开课才了解一点,现在和大家分享一下我的理解! 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时.比如,在进行窗口的resize.scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕,请求的次数多了浏览器会造成卡

详谈js防抖和节流

本文由小芭乐发表 0. 引入 首先举一个例子: 模拟在输入框输入后做ajax查询请求,没有加入防抖和节流的效果,这里附上完整可执行代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>没有防抖</title> <style type="text/css"></sty

前端进击的巨人(八):浅谈函数防抖与节流

本篇课题,或许早已是烂大街的解读文章.不过春招系列面试下来,不少伙伴们还是似懂非懂地栽倒在(-面试官-)深意的笑容之下,权当温故知新. JavaScript的执行过程,是基于栈来进行的.复杂的程序代码被封装到函数中,程序执行时,函数不断被推入执行栈中.所以 "执行栈" 也称 "函数执行栈". 函数中封装的代码块,一般都有相对复杂的逻辑处理(计算/判断),例如函数中可能会涉及到 DOM 的渲染更新,复杂的计算与验证, Ajax 数据请求等等. 前端页面的操作权,大部分

2019 面试准备 - JS 防抖与节流 (超级 重要!!!!!)

Hello 小伙伴们,如果觉得本文还不错,记得给个 star , 你们的 star 是我学习的动力!GitHub 地址 本文涉及知识点: 防抖与节流 重绘与回流 浏览器解析 URL DNS 域名解析 TCP 三次握手与四次挥手 浏览器渲染页面 在本文中,jsliang 会讲解通过自我探索后关于上述知识点的个人理解,如有纰漏.疏忽或者误解,欢迎各位小伙伴留言指出. 如果小伙伴对文章存有疑问,想快速得到回复. 或者小伙伴对 jsliang 个人的前端文档库感兴趣,也想将自己的前端知识整理出来. 欢迎

【源码】防抖和节流源码分析

前言 防抖.节流主要用于频繁事件触发,例如鼠标移动.改变窗口大小等.lodash等函数库具备相对应的api, _.debounce ._.throttle. 核心技术:闭包. 区别: 防抖, 连续触发, 第一次和最后一次触发有效 节流, 一段时间内仅触发一次(第一次) 本文以防抖函数为例, 详细说明. 实现 原理, 计时器存储状态. function debounce(fn, delay) { return function() { console.log(fn.timer, count2);

防抖和节流

在前端开发中,有一部分用户行为会频繁的触发事件,而对于DOM操作,资源加载等耗费性能的处理,很可能会导致卡顿,甚至浏览器的崩溃.防抖和节流就是为了解决这一类的问题. window.onscroll = function () { //滚动条位置 let scrollTop = document.body.scrollTop || document.documentElement.scrollTop; console.log('滚动条位置:' + scrollTop); } 效果如下 从效果上,我

函数防抖与节流

1.为什么会有函数的防抖与节流及使用场景 在进行窗口的resize.scroll,输入框内容校验或者向后端发起ajax等操作时, 如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕. 此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少调用频率,同时又不影响实际效果. 2.函数防抖与函数节流的概念及实现原理 函数防抖(debounce): 当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了