JavaScript 防抖和节流遇见的奇怪问题及解决

JavaScript 防抖和节流遇见的奇怪问题及解决

什么是防抖和节流

防抖和节流都是用来限制某个函数的执行频率,防止函数被频繁执行,造成CPU资源浪费等问题。

防抖和节流也是前端开发中比较常用的技术。防抖通常用在用户输入的场景中,如搜索框输入联想;节流主要用在鼠标滚动等频繁触发的场景中,如图片懒加载。

防抖和节流的实现方式各有不同。防抖的原理是对事件的触发进行时间限制,只有当一定时间内没有再次触发事件时,才执行函数;而节流是规定了一定时间间隔,只有当时间间隔达到后才执行函数。

下面分别介绍一下防抖和节流的应用场景和具体实现方式。

防抖的应用场景

以下是防抖的一个经典应用场景:用户输入关键字搜索联想。

当用户在搜索框中输入一个字母,此时JS代码就会立即执行一次搜索,这样是非常浪费资源的,因为用户通常不会一直连续输入,所以我们可以通过防抖技术限制搜索操作频率。

防抖的具体实现方式

防抖的具体实现方式是,在事件被触发 n 秒后执行回调,如果在这 n 秒内事件被触发,那么会重新计时,直到执行。

以下是防抖的一段示例代码:

function debounce(func, wait) {
  let timer = null;
  return function() {
    let context = this;
    let args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);
    }, wait);
  }
}

节流的应用场景

以下是节流的一个经典应用场景:图片懒加载。

在某些网页中,常常有一些图片需要滚动到特定的位置才加载出来。如果滚动过程中频繁的触发图片加载,可能会出现页面卡顿的问题。

这时,我们可以通过节流技术限制触发频率来达到优化的效果。

节流的具体实现方式

节流的具体实现方式是,每隔一定时间执行一次回调函数。

以下是节流的示例代码:

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

JavaScript防抖和节流遇见的奇怪问题及解决

在实际使用防抖和节流的时候,也许会遇到一些问题,下面就两个问题进行介绍和解决。

场景一:函数带参数

在防抖和节流的过程中,如果需要处理的函数带有参数,该怎么办呢?

通过以下代码可以解决该问题:

function debounce(func, wait) {
  let timer = null;
  return function() {
    let context = this;
    let args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);
    }, wait);
  }
}

// 传递参数时使用箭头函数
let searchInput = document.getElementById('search-input');
searchInput.addEventListener('input', debounce(() => {
  let value = searchInput.value;
  // 具体的操作代码
}, 500));

场景二:保证函数在最后一次调用后执行

防抖的特点是,只有在最后一次调用时才会执行函数。但是这可能会有一个问题,就是在调用最后一次之后,函数还需要一些时间才能完成执行。

解决这个问题的方式,也是使用防抖,但是使用新的定时器:

function debounce(func, wait) {
  let timer = null;
  return function() {
    let context = this;
    let args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);
    }, wait);
    // 使用新的定时器
    setTimeout(() => {
      clearTimeout(timer);
      timer = null;
    }, wait + 100);
  }
}

这样就可以保证函数会在最后一次调用后的一定时间后再执行,避免了函数未能完整执行的问题。

总结

本文介绍了防抖和节流两种前端开发中经常用到的技术,并给出了两个场景下的解决方案,希望能够帮助广大前端开发者更好的利用这两种技术进行开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 防抖和节流遇见的奇怪问题及解决 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQWidgets jqxTreeGrid pagerMode属性

    以下是关于 jQWidgets jqxTreeGrid 组件中 pagerMode 属性的详细攻略。 jQWidgets jqxTreeGrid pagerMode 属性 jQWidgets jqxTreeGrid pagerMode 属性于设置 TreeGrid 控件分页器模式。您可以使用此属性来控制分页器的外观和行为。 语法 $(‘#treegrid’)…

    jquery 2023年5月12日
    00
  • 基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解

    标题:基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解 一、前言 表单验证是Web开发中非常重要且必要的一环,不仅能够有效防止无效或非法数据的录入,同时也可以增强用户使用体验。本文将介绍一种基于jQuery.validate及Bootstrap的tooltip组件实现表单校验的方法。 二、简介 2.1(…

    jquery 2023年5月28日
    00
  • ASP.NET 页面中动态增加的控件、添加事件第1/2页

    ASP.NET 是微软公司开发的一种 Web 应用程序开发框架。在 ASP.NET Web 应用程序中,通过动态增加控件和添加事件来实现对页面的扩展和定制化。本攻略将向您展示如何在 ASP.NET 页面中动态增加控件和添加事件。 一、动态增加控件 ASP.NET 页面默认由一组静态 HTML 控件组成。为了允许在页面运行时动态增加控件,可以通过以下步骤实现:…

    jquery 2023年5月27日
    00
  • 基于Jquery+Ajax+Json的高效分页实现代码

    下面是关于“基于jQuery+Ajax+JSON的高效分页实现代码”的完整攻略: 一、前置知识 jQuery的基本用法 Ajax的基本用法 JSON的基本用法 以上三个知识点对于本文中的代码实现都是非常重要的,如果你还不熟悉或者不了解,建议先学习一下。 二、实现步骤 1. 编写HTML代码 <div id="content">…

    jquery 2023年5月18日
    00
  • jQWidgets jqxDateTimeInput animationType属性

    以下是关于“jQWidgets jqxDateTimeInput animationType属性”的完整攻略,包含两个示例说明: 简介 jqxDateTimeInput 控件的 animationType 属性用于日期时间选择器的动画类型。 完整攻略 以下是 jqxDateTimeInput 控件 animationType 属性的完整攻略。 定义 anim…

    jquery 2023年5月11日
    00
  • jQWidgets jqxDataTable rowUnselect事件

    以下是关于“jQWidgets jqxDataTable rowUnselect事件”的完整攻略,包含两个示例说明: 简介 jqx件的 rowUnselect 在行被取消选中后触发,通过监听事件,在行被取消选中后执行自定义的操作例如清空子格、更新界面。 攻 以下是 jqx 控 rowUnselect 事件的整攻略: 监听 rowUnselect 事件 在 j…

    jquery 2023年5月11日
    00
  • jquery如何获取复选框的值

    获取复选框的值是 JQuery 中的常见操作之一。下面简单讲解一下如何使用 JQuery 来获取复选框的值。 1. 获取单个复选框的值 要获取单个复选框的值,首先需要给复选框设置一个 id。然后使用 JQuery 的 val() 方法来获取该复选框的状态,即选中(checked)还是未选中(unchecked)。 示例代码如下: <!DOCTYPE h…

    jquery 2023年5月28日
    00
  • jQuery event.isImmediatePropagationStopped()方法

    jQuery event.isImmediatePropagationStopped()方法是用于检查事件是否已经被立即停止传播的方法。该方法可以用于在事件处理程序中检查是否已经被立即停止传播,便据需要执行其他操作。 以下是jQuery event.isImmediatePropagationStopped()方法的详细攻略: 语法 event.isImme…

    jquery 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部