防抖的原理及使用

news/2024/12/13 2:23:53/

防抖

原理

事件响应函数在一段时间后才执行,如果在这段时间内再次调用,则重新计算执行时间;当预定的时间内没有再次调用该函数,则执行该事件响应函数。

	// 这里用代码解释一下,如果不用防抖let count = 0// 演示事件是如何频繁发生的const container = document.querySelector('#container')container.onmousemove = doSomeThing // 事件响应函数function doSomeThing() {container.innerHTML = count++// 如果有ajax请求,也会一直请求并向后端发送}

如果不用防抖,那么只要鼠标在container区域移动,就会一直触发事件响应函数doSomeThing,如果在事件响应函数里面是执行ajax请求,那么就意味着只要鼠标移动,就会不停地向服务器发送ajax请求,容易导致服务器崩溃,所以我们会用到防抖。

	// 完成简单的防抖(鼠标不停地移动时不会触发doSomeThing事件,当鼠标停下时才会触发)let count = 0const container = document.querySelector('#container')// 鼠标移动响应事件,直接调用防抖函数container.onmousemove = debounce(doSomeThing, 300) function doSomeThing() {// 这里的this是指向window的,如果需要用this,就比较麻烦container.innerHTML = count++}// 防抖函数function debounce(func,wait){let timeoutreturn function() {timeout && clearTimeout(timeout)timeout = setTimeout(() => {func()}, wait)}}
// 完善防抖功能
// func:事件响应函数
// wait:时间间隔
// immediate:是否立即执行
function debounce(func, wait, immediate){let timeoutreturn function() { let context = this  // this指向container容器,将其保存下来let args = arguments  // arguments中有鼠标事件(Event对象)clearTimeout(timeout)if(immediate) {  // 立即执行,就是在鼠标滑动会立即执行,不等await时间间隔,但是在鼠标不停的滑动时不会执行,而是// 在鼠标停下来的那一刻,马上执行,不再等await时间let callNow = !timeout // 在鼠标不停地滑动过程中,timeout是有值的,所有callNow为false,就不会执行func函数timeout = setTimeout(() => {timeout = null}, wait)// 立即执行if(callNow) func.apply(context, args)} else {// 不会立即执行timeout = setTimeout(function() {// console.log(this)  // 内部函数 this是指向 window 的// console.log(context) // 所以要用外部函数的 this(container)func.apply(context, args)  // context.func() ->this.func()}, wait)}    }
}let count = 0
const container = document.querySelector('#container')function doSomeThing(e) {// 改变内部函数 this 的指向// console.log(this)  // this 本来指向 window// debounce中通过外部函数调用doSomeThing方法后,这里的this就指向了container// event指向问题console.log(e)  // 将 event对象传到该函数中// 可能会做回调或者ajax请求container.innerHTML = count++
}// 防抖
container.onmousemove = debounce(doSomeThing, 300, true)

防抖的应用场景

1.scroll事件滚动触发
2.搜索框输入查询
3.表单验证
4.按钮提交事件
5.浏览器窗口缩放,resize事件

http://www.ppmy.cn/news/480343.html

相关文章

JavaScript专题(三)防抖

防抖 目录 一、为什么需要防抖二、防抖的原理三、防抖简单实现四、防抖进阶写在最后 一、为什么需要防抖 高频的函数操作可能产生不好的影响如:resize、scroll、mousedown、mousemove、keyup、keydown…… 为此,我们举个示例代码来了解事件如何频繁…

防抖的详细解读

防抖的详细解读 场景例子说明+代码实现不运用防抖运用防抖(逐渐优化)版本一:(基本效果)版本二:(this问题)版本三:(enent对象问题)版本四:(立即执行)版本五:(返回值)版本六:(撤销操作)场景 滚动条的滚动网络请求mousemove…总之一个事件频繁的触发,而我们恰…

前端必会——防抖

目录 前言一、什么是防抖?二、防抖解决了什么问题三、实现防抖的基本代码四、防抖的应用场景1.代码实现2.结果展示 总结 前言 本文讲解一下js中防抖思想,下方有实现防抖的基本代码,可以复制到自己的编辑器看看效果哦。也有实际的应用场景&am…

防抖云台-鸡头稳定 简介篇

概念 EIS Electronic Image Stabilization 电子图像防抖 AIS (HUAWEI) AI Image Stabiliza 华为AI防抖 OIS Optical Image Stabilization 光学图像防抖 简介 Chicken Head Tracking 视频 原理 转自 松鼠会 与 果壳 当鸽子抬起后脚往前走,重心随着身体紧跟…

图像视频防抖

视频防抖 该项技术关键字挺多的,但作用都是去除视频拍摄过程中轻微抖动造成的图像模糊。 Anti-Shake,Shake-proof, imagestabilization都是这个意思,image stabilization是由canon最先开始这么称呼的,Anti-shake更通用一点。 该…

防抖、节流的介绍

目录 一、什么时候要用到防抖节流 输入框连续输入的案例 滚动条案例 二、什么是防抖、节流 使用防抖来解决输入框案例造成的浪费现象: 使用节流来解决滚动条案例造成的浪费现象: 三、总结 一、什么时候要用到防抖节流 针一类类快速连续触发和不可控…

视频防抖技术的实现

1. 介绍 视频防抖是指用于减少摄像机运动对最终视频的影响的一系列方法。摄像机的运动可以是平移(比如沿着x、y、z方向上的运动)或旋转(偏航、俯仰、翻滚)。 对视频防抖的需求在许多领域都有。 这在消费者和专业摄像中是极其重…

EIS(电子稳像,视频防抖)算法开发记录

最近项目中有个小需求,需要对运动视频使用电子稳像算法进行稳像处理。开发从0开始,在此记录一下开发过程和心得,做个备份,期间也走了很多弯路,供大家参考。最终效果个人认为基本可媲美主流手机。先上最终效果&#xff…