javascript - 有没有办法同时捕获同一类型的多个事件?

标签 javascript events

我正在为这个大型(且文档不多)框架开发一个插件。我需要将 Javascript 函数绑定(bind)到事件。问题是,这个事件几乎在同一时间被多次触发(我无法控制),并且我只需要该函数运行一次,特别是因为其中包含一些 Ajax 调用。

我对Javascript不太熟悉,所以这个问题可能非常愚蠢,但是有没有办法以某种方式在短时间内“缓冲”事件,并且当没有更多传入时运行该函数?

最佳答案

这通常称为去抖动。这是good article关于节流和去抖。

The Debounce technique allow us to "group" multiple sequential calls in a single one.

本文中列出了多个实现,但示例实现可能是(此版本将在多次调用结束时调用事件,一旦它们停止触发指定数量的事件)时间):

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 毫秒。

关于javascript - 有没有办法同时捕获同一类型的多个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56934533/

相关文章:

events - signalR调用客户端时如何在Angular2中抛出事件

iphone - 当有人隐藏/显示选项卡栏时是否有任何选项卡栏事件用于通知?

javascript - extjs 6.5.2 modern - beforeremove、beforeclose、close not firing

javascript - 使用表单输入在 $.ajax() 方法中设置 var?

javascript - 使用 Spry 在打开的选项卡上加载内容

javascript - 尝试与 window.onload 一起执行两个 JavaScript 文件

javascript - 如何对代码进行后续处理以加入两个以上的表?

javascript - 如何制作 ng-bind-html angularjs 代码

javascript - 如何将字符映射到 IE/Mozilla 按键代码以与 Javascript keyup 事件一起使用?