首页 web前端 js教程 快速提示:如何油门滚动事件

快速提示:如何油门滚动事件

Feb 17, 2025 am 10:07 AM

Quick Tip: How to Throttle Scroll Events

关键要点

  • 监听滚动事件可能导致性能下降,因为浏览器会在每次用户滚动时执行回调函数;节流和去抖是管理此问题的两种常用函数。节流保证在给定的时间间隔内事件的恒定流动,而去抖将一系列事件组合成单个事件。
  • 在 JavaScript 中实现事件节流可能很复杂,建议使用像 lodash 这样的第三方实现,它是事件节流的标准。Lodash 的节流函数简化了滚动事件节流,并提供选项来确定回调函数是否在事件的前沿和/或后沿执行。
  • 选择节流和去抖的关键在于查看要解决问题的性质。节流适用于在给定时间跨度内发生的事件,例如滚动,而去抖适用于按键等事件,其中事件之间的间隔并不重要。

本文由 Vildan Softic 和 Julian Motz 共同评审。感谢所有 SitePoint 的同行评审员,使 SitePoint 的内容达到最佳状态!

监听滚动事件的危险之一是性能下降。浏览器会在用户每次滚动时执行回调函数,这每秒可能会有很多事件。如果回调函数执行大量重绘操作,这对最终用户来说意味着坏消息。重绘代价高昂,尤其是在重绘视图的大部分内容时,例如发生滚动事件时的情况。

下面的示例说明了这个问题:

查看 CodePen 上的示例:未节流的滚动事件

除了性能下降和容易引起癫痫发作之外。此示例说明了当计算机完全按照您的指示执行操作时会发生什么。背景颜色之间没有平滑的过渡,屏幕只是闪烁。任何不幸的程序员都可能觉得在这个世界上没有希望了。难道没有更好的方法吗?

规范事件

一种解决方案是推迟事件并一次管理多个事件。有两个常用的函数可以帮助我们做到这一点:节流和去抖。

节流保证在给定的时间间隔内事件的恒定流动,而去抖将一系列事件组合成单个事件。一种思考方式是节流是基于时间的,而去抖是基于事件的。节流保证执行,而去抖在分组发生后则不保证执行。如果您想了解具体信息,请查看这篇关于去抖与节流的深入讨论。

去抖

去抖解决的是不同的问题,例如带有 Ajax 的按键。当您在表单中键入内容时,为什么要为每个按键发送请求?更优雅的解决方案是将一系列按键组合成一个事件,该事件将触发 Ajax 请求。这符合键入的自然流程并节省了服务器资源。对于按键,事件之间的间隔并不重要,因为用户不会以恒定的速率键入。

节流

由于去抖没有保证,因此另一种方法是对滚动事件进行节流。滚动发生在给定的时间跨度内,因此进行节流是合适的。一旦用户开始滚动,我们希望保证及时执行。

此技术有助于检查我们是否位于页面的特定部分。鉴于页面的大小,滚动浏览内容需要很多秒。这使得节流能够仅在任何给定的间隔内触发一次事件。事件节流将使滚动体验更流畅并保证执行。

下面是使用原生 JavaScript 编写的简陋的事件节流器:

function throttle(fn, wait) {
  var time = Date.now();
  return function() {
    if ((time + wait - Date.now()) < 0) {
      fn();
      time = Date.now();
    }
  }
}
登录后复制

此实现设置一个时间变量,该变量跟踪函数第一次调用时的时刻。每次调用返回的函数时,它都会检查等待间隔是否已过去,如果已过去,则它会触发回调并重置时间。

查看 CodePen 上的示例:原生 JS 节流实现

使用库

事件节流有很多危险,不建议自己编写。与其编写自己的实现,我建议使用第三方实现。

lodash

lodash 是 JavaScript 中事件节流的事实上的标准。此库是开源的,因此您可以随意浏览代码。好处是该库是模块化的,因此可以从中获取所需的内容。

使用 lodash 的节流函数,滚动事件节流变得很简单:

window.addEventListener('scroll', _.throttle(callback, 1000));
登录后复制

这将传入的滚动事件洪流限制为每 1000 毫秒(一秒钟)一次。

API 提供了前沿和后沿选项,如下所示:

_.throttle(callback, 1, { trailing: true, leading: true });
登录后复制

这些选项确定回调函数是否在事件的前沿和/或后沿执行。

这里的一个问题是,如果您将前沿和后沿都设置为 false,则回调函数不会触发。将前沿设置为 true 将立即开始回调执行,然后进行节流。当您将前沿和后沿都设置为 true 时,这将保证每个间隔的执行。

查看 CodePen 上的演示:节流滚动事件

从查看源代码中,我发现有趣的是 throttle() 只是 debounce() 的包装器。节流只是传递一组不同的参数来更改所需的行为。节流设置一个 maxWait,一旦等待这么长时间,它就会保证执行。其余的实现保持不变。

我希望您在下次事件节流冒险中发现 lodash 对您有益!

结论

节流与去抖的关键在于查看要解决问题的性质。这两种技术适用于不同的用例。我建议从用户的角度来看待问题以找到答案。

使用 lodash 的好处在于它在一个简单的 API 中抽象了大量复杂性。好消息是您可以在项目中使用 _.throttle(),而无需添加整个库。有 lodash-cli,这是一个工具,可以让您只创建包含所需函数的自定义构建。事件节流只是整个库的一小部分。

关于节流滚动事件的常见问题解答 (FAQ)

  • 在 JavaScript 中节流滚动事件的目的是什么?

在 JavaScript 中节流滚动事件是一种用于优化网站或 Web 应用程序性能的技术。当用户在网页上滚动时,浏览器会为每个像素的移动生成一个滚动事件。这可能导致每秒生成数百甚至数千个事件,这会严重降低网页的性能。通过节流这些事件,我们可以限制处理的事件数量,从而提高网页的性能和响应速度。

  • JavaScript 中的节流是如何工作的?

JavaScript 中的节流通过在事件执行之间设置延迟来工作。当触发事件时,计时器启动。如果在计时器结束之前触发另一个事件,则会忽略该事件。这确保了在处理另一个事件之前必须经过一定的时间量。此技术对于经常触发的事件(例如滚动事件)特别有用。

  • 节流和去抖的区别是什么?

节流和去抖都是用于限制函数可以随时间执行次数的技术。两者之间的主要区别在于它们如何处理延迟。节流确保函数每 X 毫秒不会调用超过一次,而去抖确保函数直到自上次调用以来经过 X 毫秒后才会调用。换句话说,节流以规则的间隔执行函数,而去抖在一段时间不活动后执行函数。

  • 我如何在 JavaScript 中实现节流?

可以使用 setTimeout 函数在 JavaScript 中实现节流。此函数允许您将函数的执行延迟指定的毫秒数。通过将 setTimeout 与事件侦听器结合使用,您可以确保事件处理程序函数每 X 毫秒不会调用超过一次。

  • 除了滚动事件之外,我还可以将节流与其他事件一起使用吗?

是的,节流可以与 JavaScript 中的任何类型的事件一起使用,而不仅仅是滚动事件。它对于经常触发或需要大量处理的事件特别有用,例如鼠标移动事件、调整大小事件和按键事件。

  • 是否有任何库或框架提供对节流的内置支持?

是的,有几个库和框架提供对节流的内置支持。例如,流行的 JavaScript 实用程序库 Lodash 提供了一个节流函数,使实现节流变得容易。同样,流行的 JavaScript 库 jQuery 也在其 API 中提供了一个节流函数。

  • 节流的潜在缺点是什么?

虽然节流可以提高网页的性能,但如果使用不当,它也可能导致用户体验响应速度较慢。例如,如果延迟设置得太高,用户可能会注意到他们的操作与网页的响应之间存在滞后。因此,在使用节流时,在性能和响应速度之间找到平衡非常重要。

  • 我如何测试节流的有效性?

您可以通过在实现节流之前和之后测量网页的性能来测试节流的有效性。这可以使用浏览器开发者工具来完成,该工具提供有关网页性能的详细信息,包括处理事件所需的时间。

  • 节流可以与其他性能优化技术结合使用吗?

是的,节流可以与其他性能优化技术结合使用,例如去抖和 requestAnimationFrame。通过结合这些技术,您可以进一步提高网页的性能和响应速度。

  • 节流是否有替代方案?

是的,节流有几种替代方案,包括去抖和 requestAnimationFrame。去抖类似于节流,但它不是限制函数可以随时间调用的次数,而是确保函数直到自上次调用以来经过一定时间后才会调用。requestAnimationFrame 是一种告诉浏览器执行动画并请求浏览器在下次重绘之前调用指定函数来更新动画的方法。

以上是快速提示:如何油门滚动事件的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript:探索网络语言的多功能性 JavaScript:探索网络语言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

如何使用Next.js(前端集成)构建多租户SaaS应用程序 如何使用Next.js(前端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:22 AM

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

如何安装JavaScript? 如何安装JavaScript? Apr 05, 2025 am 12:16 AM

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。

See all articles