javascript - 有没有办法一次捕获多个相同类型的事件?
问题描述
我正在为这个大的(并且没有很好的文档记录)框架开发一个插件。我需要将 Javascript 函数绑定到事件。问题是,这个事件几乎在同一时间被触发多次(我无法控制),我需要该函数只运行一次,特别是因为其中包含一些 Ajax 调用。
我对 Javascript 不是很熟悉,所以这个问题可能很愚蠢,但是有没有办法以某种方式在短时间内“缓冲”事件,并且当没有更多传入时,运行该函数?
解决方案
这通常称为debouncing
. 这是一篇关于节流和去抖动的好文章。
Debounce 技术允许我们将多个顺序调用“组合”在一个调用中。
文章中列出了多个实现,但一个示例实现可能是(此版本将在您的多个调用结束时调用该事件,一旦它们停止触发指定的时间量):
function debounce(callback, duration) {
let timer = null;
let args = [];
let thisVal = null;
function trigger() { callback.apply(thisVal, args); }
function onEvent() {
thisVal = this;
args = [].slice.call(arguments);
clearTimeout(timer);
timer = setTimeout(trigger, duration);
}
return onEvent;
}
然后您可以使用以下代码调用它,例如:
function myEventListener(data) {
// do your thing
}
window.addEventListener('my-event', debounce(myEventListener, 100));
这将阻止再次调用您的事件侦听器,直到它停止被触发至少 100 毫秒。
推荐阅读
- azure-pipelines - Azure devops 发布管道以使用 BTDF 部署 BizTalk 应用程序
- python - PgBouncer:关闭,因为:客户端关闭请求并关闭,因为:服务器不干净
- google-cloud-platform - Python Google API Campaign Manager 插入广告素材资产显示成功,但未出现在广告客户中
- javascript - 带有数据集的 jQuery 元素
- vue.js - 在 vue js 中传递 HTML 标签
- c# - 如何使用 C# .net 访问 Rider IDE 中的 MySql 或 Postgres 数据库进行控制台应用程序?
- typescript - Typescript:如何通过接口类型传递 9999999999999999?
- ios - 如何制作自定义标签栏?
- heroku - 我可以在哪里部署 ml 算法而不会超时?
- python - 类型强制是否与为什么 dict(c=c) 在 Python 中工作有关?