封装在函数中的 JavaScript 事件监听器

标签 javascript jquery jquery-events

我有一个函数中的事件监听器。监听器和发射器都在同一个函数中。

当事件触发时,变量会增加。到目前为止,一切都很好。但是当我多次调用该函数时,在同一个函数调用中多次触发监听器。

var test = function() {    
    var completeStatus = 0;

    $(document).on('gt', function() {
        console.log(++completeStatus);
    });
    $(document).trigger('gt');
}

test();
test();
test();

它期望它输出 1 3 次,因为该函数被调用了 3 次。但它输出:

0
1
0
2
1

为什么会这样以及如何获得所需的行为?

这是一个 jsfiddle尝试一下。

最佳答案

因为你正在使用 $(document).trigger('gt');所以它在所有文档事件中启动触发事件,这就是为什么增加函数返回输出的调用,如

0       //from first function call
1 0     //from second function call 
2 1 0   //frm third function call
.... and so on

解决方案:

var test = function() {    
    var completeStatus = 0;
    var pageInitialized = false;    
    $(document).on('gt', function() {
        if(pageInitialized) return;
        console.log(++completeStatus);
        pageInitialized = true;
    });
    $(document).trigger('gt');
}

test();
test();
test();

关于封装在函数中的 JavaScript 事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31115613/

相关文章:

javascript - 单选按钮不会从 "optionA"更改 - AJAX/JAVASCRIPT

javascript - jQuery 仅在事件中保存最后一个值

javascript - 如何将两个函数赋予委托(delegate)函数

javascript - vue.js - 从另一个组件调用组件方法

javascript - Bootstrap 崩溃不崩溃

javascript - 在 mouseout 上使用 jQuery 隐藏下拉 div

jquery - 如何使用 jquery 捕获 td 元素中的值并根据捕获的 td 值更改另一个 td 元素的背景颜色?

javascript - DRY Then and Always in jQuery Promise

javascript - JQuery(document).ready 不在页面上评估,但在文件中时执行

jquery - 仅在特定时间后触发事件 mouseenter,