防抖和节流及多种实现方式

这篇具有很好参考价值的文章主要介绍了防抖和节流及多种实现方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当用户在网页中进行操作时,如点击、滚动、输入等,往往会频繁地触发事件。如果每个事件都立即执行相应的函数,可能会导致性能问题和用户体验不佳,因为这些函数可能需要执行复杂的操作,如计算、网络请求等。

为了优化这种情况,我们可以使用防抖和节流来限制函数的调用次数,从而提高性能和用户体验。

 文章来源地址https://www.toymoban.com/news/detail-423492.html


防抖

防抖是指在一定的时间间隔内,将多次触发的事件合并成一次执行。

防抖的实现思路是:每次事件被触发时,设置一个计时器,在指定的时间间隔内,如果该事件被再次触发,则清除计时器并重新开始计时,直到指定的时间间隔内没有事件触发为止,然后调用函数。

 

防抖可以用于处理一些频繁触发的事件,如窗口大小改变、输入框输入等。以下是一个简单的防抖函数实现:

function debounce(fn, delay) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(context, args);
    }, delay);
  };
}

 

这个函数接收两个参数: fn 是要防抖的函数, delay 是防抖时间间隔。返回一个新的函数,在防抖时间间隔内,重复调用这个新函数不会立即触发原函数,只有等时间间隔过去之后才会触发。

 



节流

节流是指在一定的时间间隔内,函数只被调用一次。如果在这个时间间隔内触发了多次事件,只有第一次会调用函数,其余的会被忽略。

节流的实现思路是:每次事件被触发时,如果函数没有在指定的时间间隔内被调用过,则调用函数并设置一个计时器,在指定的时间间隔内不再触发事件。如果在指定的时间间隔内再次触发了事件,则不调用函数,直到指定的时间间隔过去,重新开始调用函数。

 

节流可以用于处理一些频繁触发的事件,如页面滚动、鼠标移动等。以下是一个简单的节流函数实现:

function throttle(fn, delay) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args);
        timer = null;
      }, delay);
    }
  };
}

这个函数接收两个参数: fn 是要节流的函数, delay 是节流时间间隔。返回一个新的函数,在指定的时间间隔内,只能调用一次原函数。

 

 

防抖和节流的实现方式可以有多种,具体实现应该根据实际场景进行调整。下面介绍一些常见的实现方式。

 


立即执行版和非立即执行版

防抖和节流的实现中,可以根据需求选择立即执行版或非立即执行版。

立即执行版是指在每次触发事件时,立即执行一次函数,然后在指定的时间间隔内不再执行。这种方式适合处理一些需要立即响应的事件,如按钮点击等。

 

以下是立即执行版的防抖函数实现:

function debounce(fn, delay, immediate) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    if (immediate && !timer) {
      fn.apply(context, args);
    }
    clearTimeout(timer);
    timer = setTimeout(function() {
      if (!immediate) {
        fn.apply(context, args);
      }
      timer = null;
    }, delay);
  };
}

 

这个函数增加了一个参数 immediate ,用来指定是否立即执行函数。如果设置为 true ,则在触发事件时立即执行函数;否则等待指定的时间间隔后再执行。

 

 

非立即执行版是指在事件停止触发指定时间后才执行一次函数。这种方式适合处理一些连续触发的事件,如输入框输入等。

以下是非立即执行版的防抖函数实现:

function debounce(fn, delay, immediate) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    if (timer) {
      clearTimeout(timer);
    }
    if (immediate && !timer) {
      fn.apply(context, args);
    }
    timer = setTimeout(function() {
      if (!immediate) {
        fn.apply(context, args);
      }
      timer = null;
    }, delay);
  };
}

这个函数与立即执行版的实现相似,区别在于多了一个 if (timer) { clearTimeout(timer); } 判断。如果计时器已经存在,则在重新设置计时器之前先清除之前的计时器。

 


时间戳版和定时器版

防抖和节流的实现中,可以根据需求选择时间戳版或定时器版。

时间戳版是指在事件触发后,记录下当前的时间戳,并在下次事件触发时再次记录时间戳。在指定的时间间隔内,如果事件再次触发,则更新时间戳。如果时间戳与当前时间的差值超过了指定的时间间隔,则执行函数。这种方式适合处理一些需要立即响应的事件,如按钮点击等。

 

以下是时间戳版的节流函数实现:

function throttle(fn, delay) {
  let last = 0;
  return function() {
    const context = this;
    const args = arguments;
    const now = +new Date();
    if (now - last > delay) {
      fn.apply(context, args);
      last = now;
    }
  };

这个函数中, last 记录上次执行函数的时间戳,每次事件触发时,计算当前时间戳与上次执行函数的时间戳的差值,如果超过指定的时间间隔,则执行函数并更新 last 。

 

 


定时器版是指在事件触发后,设置一个定时器,在指定的时间间隔内不再触发事件。如果在指定的时间间隔内再次触发了事件,则不执行函数,直到定时器到期后再次执行函数。这种方式适合处理一些连续触发的事件,如页面滚动、鼠标移动等。

 

以下是定时器版的节流函数实现:

function throttle(fn, delay) {
  let timer;
  return function() {
    const context = this;
    const args = arguments;
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args);
        timer = null;
      }, delay);
    }
  };
}

这个函数与之前介绍的非立即执行版的防抖函数实现类似,区别在于将 setTimeout 的时间间隔设置为指定的时间间隔,而不是事件触发后的延迟时间。


防抖和节流的主要区别在于它们限制函数调用的方式不同。防抖是指在指定的时间间隔内将多次触发的事件合并成一次执行,而节流是指在指定的时间间隔内,函数只被调用一次。同时,防抖和节流也有一些缺点,比如可能会导致事件响应延迟或事件被忽略等问题。因此,在实际使用中,需要根据场景进行权衡和选择。

 

到了这里,关于防抖和节流及多种实现方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • axios、跨域与JSONP、防抖和节流

    Axios 是专注于 网络数据请求 的库。 相比于原生的 XMLHttpRequest 对象,axios 简单易用 。 相比于 jQuery,axios 更加 轻量化 ,只专注于网络数据请求。 axios.get(\\\'url\\\', { params: { /*参数*/ } }).then(callback) 例如: axios.post(\\\'url\\\', { /*参数*/ }).then(callback) 例如: 例如: 如果两个页面的 协议

    2024年02月08日
    浏览(25)
  • 防抖和节流 含义及区别图文详解秒懂

    防抖和节流都是为解决短时间内频繁触发某个功能函数而导致的性能问题。比如,触发频率过高而导致响应速度跟不上,以致出现延迟,假死或卡顿的现象。  图解:一件事情,计划5s以后触发,结果中途意外触发了,那么就重新从0开始5秒的计时,这就导致本身计划的事情就

    2024年02月06日
    浏览(26)
  • 【js】防抖和节流的使用场景和区别:

    一、防抖 (多次触发 只执行最后一次) 作用: 高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间内再次触发,则重新计算时间 防抖类似于英雄联盟回城6秒,如果回城中被打断,再次回城需要再等6秒 二、节流 (规定时间内 只触发一次) 作用:

    2024年02月10日
    浏览(25)
  • 了解同源策略 JSONP 案例-淘宝搜索 防抖和节流

    什么是跨域 同源指的是两个 URL 的协议、域名、端口一致,反之,则是跨域。 出现跨域的根本原因:浏览器的同源策略不允许非同源的 URL 之间进行资源的交互。 网页:http://www.test.com/index.html 接口:http://www.api.com/userlist 浏览器对跨域请求的拦截 注意:浏览器允许发起跨域请

    2024年02月05日
    浏览(30)
  • JS手写防抖和节流函数(超详细版整理)

    防抖(debounce) :每次触发定时器后,取消上一个定时器,然后重新触发定时器。防抖 一般用于用户未知行为的优化 ,比如搜索框输入弹窗提示,因为用户接下来要输入的内容都是未知的,所以每次用户输入就弹窗是没有意义的,需要等到用户输入完毕后再进行弹窗提示。

    2024年02月04日
    浏览(29)
  • 了解防抖和节流:提升前端交互体验的实用策略

    本文将重点介绍前端性能优化方法之一的防抖和节流。首先解释了它们的概念和原理,然后探讨了它们在前端开发中的应用场景,如输入框搜索、滚动事件等。最后,通过简单的代码示例展示了如何实现防抖和节流函数。通过学习和应用这两种技术,我们可以有效地减少不必

    2024年02月05日
    浏览(28)
  • 前端性能优化的利器 ——— 浅谈JavaScript中的防抖和节流

    防抖和节流函数是工作中两种常用的前端性能优化函数,今天我就来总结一下什么是防抖和节流,并详细说明一下如何在工作中应用防抖和节流函数 在 JavaScript 中,防抖(debounce)和节流(throttle)是用来限制函数执行频率的两种常见技术。 防抖(debounce) 是指在某个时间段

    2024年02月14日
    浏览(37)
  • Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

    各位朋友你们好呀。今天是立春,明天就是正月十五元宵节了,这种立春 + 元宵相隔的时候,可是很难遇到的,百年中就只有几次。在这提前祝大家元宵快乐。 今天给大家带来的是 Vue 3 中的极致防抖/节流(含常见方式防抖/节流) 这篇文章,文章中不仅会讲述原来使用的防

    2024年02月01日
    浏览(29)
  • uni-app 实现节流与防抖

    提示:这次要讲的前端关于节流和防抖 防抖是指在频繁触发某一个事件时,一段时间内或者一定条件下不再触发该事件对应调用的函数。 代码如下(示例): 对按钮点击触发函数的防抖控制 : 按钮事件执行未完成时不多次重复执行对应按钮的业务逻辑。 在事件持续触发的

    2024年02月11日
    浏览(29)
  • js实现防抖(debounce)与节流(throttle)

    一句话概括:防抖是给定一个时间周期,如果触发事件的周期小于该时间(也就是触发过快),则不会触发事件。 举个例子:我给定的时间周期是1s,如果我在触发第一次事件后1s内触发该事件,则重新开始计时,直到触发周期大于1s才会执行事件的方法。 一句话概括:节流

    2023年04月23日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包