当前位置: 首页 > news >正文

了解防抖和节流:提升前端交互体验的实用策略

了解防抖和节流:提升前端交互体验的实用策略

  • 前言
  • 什么是防抖?
  • 什么是节流?
  • 应用实例
    • 防抖实例
    • 节流实例

前言

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

什么是防抖?

定义:延迟一段时间再触发,如果再延迟时间内又触发,则清除上一个定时,再开始新的定时。
应用场景:搜索框联想、屏幕伸缩。

什么是节流?

定义:在一段时间间隔内,稀释事件的触发频率,不论事件被触发几次,只执行一次。
应用场景:
单位时间内,鼠标不论点击多少次,只执行一次(搜索内容未变化时)。
在使用列表下拉滚动加载时,用于定时监听滚动事件。

应用实例

防抖实例

下面是用防抖实现一个简易版搜索框联想+防抖

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title></title>
</head>
<body><header><h1>防抖解决搜索联想词</h1></header><main><input type="text" id="search-input" placeholder="Search..."><ul id="suggestions-list"></ul></main><script>// 1.防抖函数function debounce(func, delay) {let timer;return function (...args) {clearTimeout(timer);timer = setTimeout(() => {func.apply(this, args);}, delay);};}// 2.定义两个变量分别存储输入框id和联想词idconst searchInput = document.getElementById('search-input');const suggestionsList = document.getElementById('suggestions-list');// 3.模拟异步请求获取联想词function fetchSuggestions(keyword) {const suggestions = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig'];renderSuggestions(suggestions.filter(suggestion =>suggestion.toLowerCase().startsWith(keyword.toLowerCase())));}// 4.联想词显示函数function renderSuggestions(suggestions) {suggestionsList.innerHTML = '';suggestions.forEach((suggestion) => {const listItem = document.createElement('li');listItem.textContent = suggestion;suggestionsList.appendChild(listItem);});}// 定义默认方法,调用闭包方法,设置定时时间和防抖结束后调用的函数const debounceFetchSuggestions = debounce(fetchSuggestions, 1000);// 给输入框id增加监听器searchInput.addEventListener('input', function () {// 获取去空格value值const keyword = searchInput.value.trim();// 调用闭包方法debounceFetchSuggestions(keyword);});</script>
</body>
</html>

讲解代码
1.在html代码中写input、ul,一个用来输入,一个用来返回联想词,并给它们设置id值用于添加监听以及更新内容。
2.定义防抖函数:debounce
外层两个参数分别存储防抖事件处理方法以及延迟毫秒数。
timer用于存储定时器的引用。内部返回的闭包函数如果在延迟时间内再次被调用,则timer重置,且重新开始计时。
如果延迟时间内没有再次被调用,则调用func也就是fetchSuggestions函数,这里用到了一个方法apply,该方法有两个参数,第一个参数决定this指向的是哪个上下文环境,这里指向的是当前上下文环境,第二个为普通参数。
3.定义两个变量searchInput、suggestionsList分别把input和ul的id进行赋值。
4.模仿异步接口写方法,该方法第一层是定义了所有联想词,第二层是调用联想词显示函数。这里用到filter过滤和筛选,这里就不赘述了。
5.联想词显示函数,这里用到的是forEach遍历,createElement创建HTML元素,以及用li和appendchild加元素。
6.定义默认方法,并且设置事件处理方法和延迟毫秒数。
7.给输入框加监听器监听器中使用trim去除空格,且调用闭包函数。

节流实例

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title></title>
</head>
<body><header><h1>节流解决搜索联想词</h1></header><main><input type="text" id="searchInput"></main><script>const searchInput = document.getElementById('searchInput');function search(query) {// 模拟搜索操作,这里可以替换为实际的搜索逻辑console.log(`搜索: ${query}`);}// 使用节流函数处理搜索输入const throttleSearch = throttle(search, 1000); // 设定延迟为500毫秒searchInput.addEventListener('keyup', function(event) {const query = event.target.value.trim();throttleSearch(query);});// 节流函数实现function throttle(func, delay) {let timerId;let lastExecuted = 0;return function(...args) {const now = Date.now();const timeSinceLastExecution = now - lastExecuted;if (timeSinceLastExecution >= delay) {func.apply(this, args);lastExecuted = now;} else {clearTimeout(timerId);timerId = setTimeout(() => {func.apply(this, args);lastExecuted = Date.now();}, delay - timeSinceLastExecution);}};}</script>
</body>
</html>

我们首先获取了搜索框的元素,并定义了一个 search 函数用于模拟搜索操作。然后,我们使用节流函数 throttle 对搜索函数进行包装,设定了一个1000毫秒的延迟。
接下来,监听搜索框的 keyup 事件,并获取用户输入的查询词。每次键盘释放时,会调用节流函数 throttleSearch,并将查询词作为参数传递给搜索函数 search。
在节流函数的实现中,记录了最后一次函数执行的时间戳,并根据设定的延迟来判断是否立即执行函数或设置定时器延迟执行函数。
当用户在搜索框中输入内容时,搜索请求会在一定的时间间隔内被触发,避免了频繁的搜索请求。

相关文章:

  • 【JAVA学习笔记】 68 - 网络——TCP编程、UDP编程
  • FFmpeg获取视频关键帧并保存成jpg图像
  • Centos, RockyLinux 常用软件安装汇总
  • 使用数据泵的注意事项
  • k8s自定义Endpoint实现内部pod访问外部应用
  • 307.区域和检索
  • Idea 编译SpringBoot项目Kotlin报错/Idea重新编译
  • YOLOv8-Seg改进:卷积变体系列篇 | DCNv3可形变卷积基于DCNv2优化 | CVPR2023
  • 2001-2022年全国平均气温数据,逐月数据均有
  • 鼎捷PLM:引领国产替代,创造极致体验,探索数字化研发可行之路
  • 【图论实战】 Boost学习 03:dijkstra_shortest_paths
  • 数据库MHA高可用
  • 浪潮服务器安装操作系统
  • 【iOS】JSONModel的基本使用
  • PyCharm鼠标控制字体缩放
  • hexo+github搭建个人博客
  • JavaScript-如何实现克隆(clone)函数
  • #Java异常处理
  • 【笔记】你不知道的JS读书笔记——Promise
  • echarts花样作死的坑
  • java8-模拟hadoop
  • JavaScript 基础知识 - 入门篇(一)
  • Netty源码解析1-Buffer
  • node 版本过低
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 爱情 北京女病人
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端_面试
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 思否第一天
  • Java数据解析之JSON
  • Java总结 - String - 这篇请使劲喷我
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​用户画像从0到100的构建思路
  • (2)STL算法之元素计数
  • (floyd+补集) poj 3275
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (一)kafka实战——kafka源码编译启动
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .NET BackgroundWorker
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET 反射的使用
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .Net(C#)自定义WinForm控件之小结篇
  • .net下的富文本编辑器FCKeditor的配置方法
  • .NET业务框架的构建
  • @EnableWebMvc介绍和使用详细demo
  • @JSONField或@JsonProperty注解使用
  • [《百万宝贝》观后]To be or not to be?
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [20181219]script使用小技巧.txt
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [dfs] 图案计数
  • [Docker]十.Docker Swarm讲解