我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript节流与防抖实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript节流与防抖实例分析

本篇内容主要讲解“JavaScript节流与防抖实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript节流与防抖实例分析”吧!

    一、js防抖和节流

    在进行窗口的resize、scroll、输出框内容校验等操纵的时候,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常之差。那么为了前端性能的优化也为了用户更好的体验,就可以采用防抖(debounce)和节流(throttle)的方式来到达这种效果,减少调用的频率。

    二、为什么滚动scroll、窗口resize等事件需要优化

    滚动事件的应用很频繁:图片懒加载、下滑自动加载数据、侧边浮动导航栏等。

    在绑定scroll、resize事件时,但它发生的时候,它被触发的频率非常高,间隔很近。在日常开发的页面中,事件中涉及到的大量的位置计算、DOM操作、元素重绘等等这些都无法在下一个scroll事件出发前完成的情况下,浏览器会卡帧。

    三、滚动和页面渲染前端性能优化的关系

    为什么滚动需要优化?前面提到了事件中涉及到大量的位置计算、DOM操作、元素重绘等等,这些又与页面的渲染有关系,页面渲染又与前端的性能优化有关系?套娃一样,一层套着一层,每一层都联系紧密,每一层都如此平凡且重要。

    review一下前端的渲染和优化

    网页生成的时候,至少会渲染(Layout+Paint)一次。用户访问的过程中,还会不断重新的重排(reflow)和重绘(repaint),用户scroll行为和resize行为会导致页面不断的进行重新渲染,而且间隔频繁,容易造成浏览器卡帧。

    四、防抖Debounce

    1 防抖Debounce情景

    ①有些场景事件触发的频率过高(mousemove onkeydown onkeyup onscroll)

    ②回调函数执行的频率过高也会有卡顿现象。 可以一段时间过后进行触发去除无用操作

    2 防抖原理

    一定在事件触发 n 秒后才执行,如果在一个事件触发的 n 秒内又触发了这个事件,以新的事件的时间为准,n 秒后才执行,等触发事件 n 秒内不再触发事件才执行。

    官方解释:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。

    3 防抖函数简单实现

        //简单的防抖函数    function debounce(func, wait, immediate) {        //定时器变量        var timeout;        return function () {            //每次触发scrolle,先清除定时器            clearTimeout(timeout);            //指定多少秒后触发事件操作handler            timeout = setTimeout(func, wait);        };    };    //绑定在scrolle事件上的handler    function handlerFunc() {        console.log('Success');    }    //没采用防抖动    window.addEventListener('scroll', handlerFunc);    //采用防抖动    window.addEventListener('scrolle', debounce(handlerFunc, 1000));

    4 防抖函数的演化过程

    ①this event绑定问题
        //以闭包的形式返回一个函数,内部解决了this指向的问题,event对象传递的问题    function debounce(func, wait) {        var timeout;        return function () {            var context = this;            var args = arguments;            clearTimeout(timeout)            timeout = setTimeout(function () {                func.apply(context, args)            }, wait);        };    };
    ②立即触发问题
        //首次触发执行,再次触发以后开始执行防抖函数    //使用的时候不用重复执行这个函数,本身返回的函数才具有防抖功能function debounce(func, wait, immediate) {    var timeout;    return function () {        var context = this;        var args = arguments;                if(timeout) clearTimeout(timeout);        // 是否在某一批事件中首次执行        if (immediate) {            var callNow = !timeout;            timeout = setTimeout(function() {                timeout = null;                func.apply(context, args)                immediate = true;            }, wait);            if (callNow) {                func.apply(context, args)            }            immediate = false;        } else {            timeout = setTimeout(function() {                func.apply(context, args);                immediate = true;            }, wait);        }    }}
    ③返回值问题
    function debounce(func, wait, immediate) {    var timeout, result;    return function () {        var context = this, args = arguments;        if (timeout)  clearTimeout(timeout);        if (immediate) {            var callNow = !timeout;            timeout = setTimeout(function() {                result = func.apply(context, args)            }, wait);            if (callNow) result = func.apply(context, args);        } else {            timeout = setTimeout(function() {                result = func.apply(context, args)            }, wait);        }        return result;    }}
    ④取消防抖,添加cancel方法
    function debounce(func, wait, immediate) {    var timeout, result;    function debounced () {        var context = this, args = arguments;        if (timeout)  clearTimeout(timeout);        if (immediate) {            var callNow = !timeout;            timeout = setTimeout(function() {                result = func.apply(context, args)            }, wait);            if (callNow) result = func.apply(context, args);        } else {            timeout = setTimeout(function() {                result = func.apply(context, args)            }, wait);        }        return result;    }    debounced.cancel = function(){        cleatTimeout(timeout);        timeout = null;    }    return debounced;}

    五、节流Throttle

    1 节流Throttle情景

    ①图片懒加载

    ②ajax数据请求加载

    2 节流原理

    如果持续触发事件,每隔一段时间只执行一次函数。

    官方解释:当持续触发事件时,保证一定时间段内只调用一次事件处理函数。

    3 节流实现—时间戳和定时器

    时间戳

        var throttle = function (func, delay) {        var prev = Date.now()        return function () {            var context = this;            var args = arguments;            var now = Date.now();            if (now - prev >= delay) {                func.apply(context, args);                prev = Date.now();            }        }    }    function handle() {        console.log(Math.random());    }    window.addEventListener('scroll', throttle(handle, 1000));

    定时器

        var throttle = function (func, delay) {        var timer = null;        return function () {            var context = this;            var args = arguments;            if (!timer) {                timer = setTimeout(function () {                    func.apply(context, args);                    timer = null;                }, delay);            }        }    }    function handle() {        console.log(Math.random());    }    window.addEventListener('scroll', throttle(handle, 1000))

    4 节流函数的演化过程

    ①时间戳触发
    //在开始触发时,会立即执行一次; 如果最后一次没有超过 wait 值,则不触发function throttle(func, wait) {    var context, args;    var previous = 0; // 初始的时间点,也是关键的时间点    return function() {        var now = +new Date();        context = this;        args = arguments;        if (now - previous > wait) {            func.apply(context, args);            previous = now;        }    }}
    ②定时器触发
    //首次不会立即执行,最后一次会执行,和用时间戳的写法互补。function throttle(func, wait){    var context, args, timeout;    return function() {        context = this;        args = arguments;        if(!timeout) {            timeout = setTimeout(function(){                func.apply(context, args);                timeout = null;            }, wait);        }    }}
    ③结合时间戳和定时器
    function throttle(func, wait) {    var timer = null;    var startTime = Date.now();      return function(){        var curTime = Date.now();        var remaining = wait-(curTime-startTime);         var context = this;        var args = arguments;        clearTimeout(timer);        if(remaining<=0){             func.apply(context, args);            startTime = Date.now();        }else{            timer = setTimeout(fun, remaining);  // 如果小于wait 保证在差值时间后执行        }    }}

    到此,相信大家对“JavaScript节流与防抖实例分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    JavaScript节流与防抖实例分析

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    JavaScript节流与防抖实例分析

    本篇内容主要讲解“JavaScript节流与防抖实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript节流与防抖实例分析”吧!一、js防抖和节流在进行窗口的resize、sc
    2023-06-29

    JavaScript如何实现防抖与节流

    这篇文章主要介绍了JavaScript如何实现防抖与节流,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概念防抖:点击N次提交按钮,只有最后一次会发出请求。减少无效请求的次数。
    2023-06-29

    JavaScript防抖与节流怎么使用

    这篇文章主要讲解了“JavaScript防抖与节流怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript防抖与节流怎么使用”吧!前言:防抖(Debounce) 和 节流(
    2023-06-30

    JavaScript防抖动与节流如何处理

    今天小编给大家分享一下JavaScript防抖动与节流如何处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。针对一些会频繁触
    2023-07-02

    JavaScript的防抖和节流怎么实现

    这篇文章主要介绍了JavaScript的防抖和节流怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript的防抖和节流怎么实现文章都会有所收获,下面我们一起来看看吧。1. 前言首先来举个例子。
    2023-06-29

    JS函数防抖和函数节流的示例分析

    这篇文章主要介绍JS函数防抖和函数节流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述函数防抖和函数节流都是定义一个函数,该函数接收一个函数作为参数,并返回一个添加了防抖或节流功能后的函数。因此可以将函数
    2023-06-15

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录