JavaScript防抖与节流详解

yizhihongxing

JavaScript防抖与节流详解

前言

在Web开发中,我们经常需要对用户的操作进行响应,比如防止用户频繁点击按钮或滚动页面。而JavaScript中通过防抖和节流两种方式来解决这个问题。防抖和节流的核心思想都是通过控制函数的执行次数来达到节省性能的效果,但两者的实现方式略有不同。

防抖

防抖的原理是将多次执行变成最后一次执行,也就是在用户停止操作一段时间后才会开始执行相应的函数。这样可以避免短时间内重复触发函数,导致资源浪费。常见应用场景包括:

  • 输入框实时搜索(避免连续输入触发多次搜索)
  • 窗口大小改变(避免不断改变窗口大小造成频繁的页面渲染)
  • 鼠标移动(避免频繁触发事件)

示例一:搜索框实时搜索

在这个示例中,我们通过防抖的方式来实现输入框搜索功能,当用户在5秒内连续输入时不会触发搜索,只有在5秒之后没有输入时才会触发搜索操作。

// 防抖函数,func为要执行的函数,delay为等待计时时间
function debounce(func, delay) {
  let timer

  return function() {
    clearTimeout(timer)
    timer = setTimeout(() => {
      func.apply(this, arguments)
    }, delay)
  }
}

// 输入框实时搜索示例
const input = document.querySelector('#search')
const search = query => console.log(`Search with query: ${query}`)

input.addEventListener('input', debounce(function() {
  search(this.value)
}, 5000))

示例二:滚动页面时隐藏和显示导航栏

在这个示例中,我们通过防抖的方式来实现滚动页面时导航栏自动隐藏和显示的效果,在用户连续滚动时不会频繁触发事件,只有在停止滚动一段时间后才会触发事件。

// 导航栏自动隐藏和显示示例
const navbar = document.querySelector('#navbar')
let prevScrollPos = window.pageYOffset
window.addEventListener('scroll', debounce(function() {
  const currentScrollPos = window.pageYOffset
  if (prevScrollPos > currentScrollPos) {
    navbar.style.top = "0"
  } else {
    navbar.style.top = "-50px"
  }
  prevScrollPos = currentScrollPos
}, 100))

节流

节流的原理是将多次执行变成每隔一段时间执行一次,也就是当一个函数正在被执行时,不管执行多少次,只在规定的时间间隔内执行一次。常见应用场景包括:

  • 滚动页面(避免频繁触发事件)
  • 监听窗口大小改变事件(避免频繁渲染)

示例一:滚动页面懒加载图片

在这个示例中,我们通过节流的方式来实现滚动页面时图片的懒加载,当用户滚动到一定位置时,才会加载对应的图片。节流的时间间隔为100ms,每100ms才会触发一次滚动事件。

// 懒加载图片示例
const images = document.querySelectorAll('img[data-src]')

function lazyLoad() {
  const scrollTop = window.pageYOffset
  const windowHeight = window.innerHeight

  images.forEach(image => {
    const top = image.getBoundingClientRect().top
    const src = image.getAttribute('data-src')
    if (top < windowHeight && top > 0) {
      image.setAttribute('src', src)
      image.removeAttribute('data-src')
    }
  })
}

window.addEventListener('scroll', throttle(lazyLoad, 100))

示例二:监听窗口大小改变事件

在这个示例中,我们通过节流的方式来监听窗口大小改变事件,每隔500ms执行一次函数,避免频繁触发window.resize事件。

// 监听窗口大小改变事件示例
function handleResize() {
  console.log(`Window width: ${window.innerWidth}, height: ${window.innerHeight}`)
}

window.addEventListener('resize', throttle(handleResize, 500))

结语

以上就是JavaScript防抖和节流的详解,防抖和节流的实现方式各有不同,开发者根据具体需求选择合适的方法可以提升页面性能,优化用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript防抖与节流详解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS二维数组的定义说明

    JS的二维数组是指一个数组中包含着另一个数组,即数组的数组。二维数组在处理矩阵类的数据时非常有用,并在编程中也经常被使用。 定义方式 定义一个二维数组可以使用以下两种方式: 嵌套数组 嵌套数组的方式就是在一个数组内部再定义一个数组,如下面的例子所示: let arr = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; 这个二维数组的…

    JavaScript 2023年5月27日
    00
  • Javascript学习指南

    Javascript学习指南 如果你想在Web开发领域中站稳脚跟,那么学习JavaScript是非常重要的。下面是一个完整的学习攻略,可以帮助你快速入门并掌握JavaScript技能。 第一步:了解基本概念 在深入学习JavaScript之前,你需要先了解以下基本概念: 变量和数据类型 运算符 控制流语句 函数 对象和数组 深入了解这些基础知识可以帮助你更好…

    JavaScript 2023年5月17日
    00
  • 16个最流行的JavaScript框架[推荐]

    16个最流行的JavaScript框架[推荐]攻略 介绍 JavaScript框架可以帮助开发者更加高效地创建Web应用程序。在这篇攻略中,我们将介绍16个最流行的JavaScript框架,这些框架功能各异,可以满足不同开发需求。在选择JavaScript框架时,我们建议开发者先考虑项目的需求和特点。以下是我们推荐的16个JavaScript框架: Angu…

    JavaScript 2023年5月18日
    00
  • javascript实现动态时钟的启动和停止

    下面是详细讲解“javascript实现动态时钟的启动和停止”的完整攻略: 一、实现动态时钟的基本原理 实现动态时钟的基本原理是使用 JavaScript 获取当前时间,并将其实时显示在网页中。在 HTML 中,我们可以通过一个 <div> 元素来作为时钟容器,然后使用 JavaScript 动态地更新 div 元素的文本内容。具体实现流程如下:…

    JavaScript 2023年5月27日
    00
  • Javascript下的urlencode编码解码方法附decodeURIComponent

    下面是Javascript下的urlencode编码解码方法附decodeURIComponent的完整攻略,希望对您有所帮助。 什么是urlencode编码? urlencode编码是将字符转换为%xx形式的编码格式,其中xx表示字符编码的十六进制表示。urlencode编码可以用于处理URL中的特殊符号。如果URL中包含特殊符号,例如空格或换行符,则必须…

    JavaScript 2023年5月20日
    00
  • javascript设置连续两次点击按钮时间间隔的方法

    一、背景介绍 在一些需要频繁操作的网页界面中,当用户连续多次点击按钮时,容易造成不必要的bug或者数据重复提交等情况。因此,为了避免这种情况的发生,我们常常需要在javascript代码中设置按钮的两次点击时间间隔。本篇攻略将会详细讲解如何实现这一功能。 二、方法讲解 使用setTimeout函数 我们可以利用setTimeout函数来设置两次点击按钮的时间…

    JavaScript 2023年6月11日
    00
  • Three.js 进阶之旅:全景漫游-高阶版在线看房 ?

    声明:本文涉及图文和模型素材仅用于个人学习、研究和欣赏,请勿二次修改、非法传播、转载、出版、商用、及进行其他获利行为。 摘要 专栏上篇文章《Three.js 进阶之旅:全景漫游-初阶移动相机版》中通过创建多个球体全景场景并移动相机和控制器的方式实现了多个场景之间的穿梭漫游。这种方式的缺点也是显而易见的,随着全景场景的增加来创建对应数量的球体,使得空间关系计算…

    JavaScript 2023年4月17日
    00
  • 深入了解Javascript的事件循环机制

    深入了解JavaScript的事件循环机制 JavaScript 是一门单线程语言,这意味着在 JavaScript 中,代码是按顺序执行的,只有前一个任务执行完成后,才会执行下一个任务。但是 JavaScript 中有许多异步操作,如定时器、事件监听器、网络请求等,这些操作不会阻塞代码的执行,可以同时执行。那么在 JavaScript 中是如何处理异步操作…

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