JavaScript防抖与节流详解

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日

相关文章

  • Javascript Global encodeURI() 函数

    以下是关于JavaScript Global对象中encodeURI()函数的完整攻略,包括两个示例说明。 JavaScript Global对象中的encodeURI()函数 JavaScript Global对象中的encodeURI()函数用于将一个URI字符串进行编码以便在URI中使用。URI(Uniform Resource Identifier)…

    JavaScript 2023年5月11日
    00
  • javascript 数组精简技巧小结

    JavaScript 数组精简技巧小结 在 JavaScript 中,数组操作是非常常见的操作。本文将总结一些数组精简技巧,帮助你在编程过程中更高效地使用数组。 1. 查询元素是否在数组中 在 JavaScript 中,可以通过 indexOf() 方法查询数组中是否包含某一元素,它会返回该元素在数组中的索引位置,如果数组中不存在该元素,返回 -1。 示例一…

    JavaScript 2023年5月27日
    00
  • 利用Blob进行文件上传的完整步骤

    利用Blob进行文件上传的步骤分为以下几步: 1.创建Blob对象 首先需要将文件转换成Blob对象,可以通过 FileReader API 或者使用FormData对象的 append 方法将文件转换成Blob对象,如下所示: // 使用FileReader API将文件转换成Blob对象 const file = document.querySelect…

    JavaScript 2023年6月11日
    00
  • js设置cookie过期及清除浏览器对应名称的cookie

    如何设置Cookie过期时间 Cookie是用来存储一些数据的,在某些情况下,我们希望对存储的cookie设置过期时间,来更好地实现一些功能。下面是利用JS设置cookie过期时间的方法: 利用JS设置cookie document.cookie = "cookieName=cookieValue;expires=Thu, 18 Dec 2022 …

    JavaScript 2023年6月11日
    00
  • 学习JavaScript设计模式(接口)

    学习JavaScript设计模式(接口)的完整攻略 什么是接口? 在JavaScript中,接口是一种抽象的概念,用于定义对象应该具有哪些方法。接口只定义方法名和参数,而没有具体的实现。 接口的作用 接口用于规范对象的行为,可以避免代码混乱和不可预测性。它定义了一种契约,约束了对象应该具有哪些方法。使用接口可以使代码更加灵活、可维护和可扩展。 如何定义接口?…

    JavaScript 2023年6月1日
    00
  • HTML中script 标签中的那些属性

    在HTML中, <script> 标签用于嵌入或引用JavaScript代码。 在 <script> 标签中,有两个属性可以用来控制脚本的加载和执行方式: async 和 defer 。 当然这也是常见的一道面试题, async  和  defer 的作用和区别。 async 和 defer 属性都可以用于异步加载脚本,从而避免了在加…

    JavaScript 2023年4月28日
    00
  • this[] 指的是什么内容 讨论

    关于”this[]”指的是什么,我们需要从以下几个方面来讨论: this关键字的含义和用法; 在使用this关键字时,this[]的含义与用法; 两个示例说明。 1. this关键字的含义和用法 在面向对象编程中,this关键字代表当前对象的引用。当我们在类的方法中使用this关键字时,代表这个类的当前对象。可以用来引用当前对象的属性和方法,也可以用来调用当…

    JavaScript 2023年6月11日
    00
  • 教你轻松记住JS正则表达式

    下面是 “教你轻松记住JS正则表达式” 的完整攻略。 一、正则表达式 正则表达式是一种可以用于匹配文本特定模式的表达式,也可称之为正则或RegExp。JavaScript 支持正则表达式,其构造函数即RegExp。 1.1 正则表达式的构造函数 在 JavaScript 中 RegExp 是正则表达式的构造函数,我们可以使用它创建正则表达式,语法如下: va…

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