javascript - 有没有办法可以将事件对象以及其他参数传递给去抖动的事件处理程序?
问题描述
我正在开发一个自定义滚动条,出于性能原因,我想添加debounce
到一个mousemove
事件中。问题是事件对象没有传递给处理程序,我得到undefined
.
这是我想做的:
function myFunc (a, b, event) {some code}
element.on('mousemove' , debounce(myfunc));
不工作!我也试过:
let myDBFunc = debounce(myFunc, 200)
element.on('mousemove', function(event){
myDBFunc(a, b, event);
});
没有什么!有任何想法吗?
更新:去抖动功能:
function debounce(func, wait = 20,immediate = true){
let timeout;
return function() {
let context = this, args = arguments;
let later = function () {
timeout = null;
if(!immediate) func.apply(context, args);
};
let callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context.args) ; //edited to func.apply(context, args);
};
}
解决方案
它不起作用,因为没有传递a
,b
参数,并且事件对象作为第一个参数传递。您可以通过匿名函数传递所有三个,如下所示:
element.on('mousemove' , (e) => debounce(myfunc)(a, b, e));
此外,在您提供该debounce
功能后,事实证明该功能接近尾声有错误。改变:
func.apply(context.args)
至:
func.apply(context, args)
此外,debounce
当您使用默认参数时,或者即使您提供非零wait
参数和true
for时,该函数也不会调用任何内容immediate
。当你改变它会更好地工作:
if(!immediate) func.apply(context, args);
至:
if(!callNow) func.apply(context, args);
演示
出于您的目的,我将使用此debounce
功能。请参阅下面带有额外参数的演示:
function debounce(func, wait = 200) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => {
timeout = setTimeout(() => timeout = null, wait);
func.apply(this, args);
}, timeout ? wait : 0);
};
}
const element = $('div');
function myfunc(a, b, e) {
console.log(a, b, e.target.tagName, performance.now());
}
const f = debounce(myfunc);
let a = 1, b = 2;
element.on('mousemove' , (e) => f(a, b, e));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>move mouse here</div>
推荐阅读
- python - 当矩阵包含至少一个 nan 时,从矩阵列表中删除任何矩阵的最有效方法是什么?
- c - 使用 c 中的低通滤波器过滤 .wav 文件
- java - 尝试添加用户输入的数据时出现问题
- javascript - Kendo DatePicker - 使用下一个/上一个按钮时日期文本消失
- list - Flutter 2:从 List 空安全创建带有 mapIndex 的子行
- php - symfony 使服务器 cpu 100% 使用率
- java - 如何解决我的应用程序中的空问题
- python-3.x - Django 自定义身份验证后端 - “is_valid”调用身份验证
- reactjs - 如何使用 Axios 和 Redux DevTools 的 Dispatcher 测试 API 请求?
- file - Innosetup - 创建文件关联