0

我在输入对象中调用“点击”函数时遇到了一点问题。函数为输入分配一个事件:

function v_start() {
      $('#next').click(function(){
                    v_check();
      });
}

现在在 javascript 文件 name.js 和 name2.js 我有: 复制代码

$(function(){
      v_start();
});

只是一个例子,但在这种情况下,函数 v_check 将在一次单击输入中被调用两次。是使事件只发生一次的条件或方式吗?为什么第二个事件不会覆盖?

4

4 回答 4

3

取消绑定并绑定以确保事件处理程序只添加一次:

$("#mySelector").unbind("click").bind("click",myFunction) 

如果有多个事件监听器:

var myFunction = function(e){ /// my code }

$("#mySelector").unbind("click",myFunction).bind("click",myFunction) 
于 2012-04-08T12:51:59.100 回答
1

每次在 jQuery 中处理事件时,它都会处理程序添加到列表中。没有“覆盖”。

在这种情况下,避免事件被分配两次的简单解决方案是附加一个数据标志,指示事件已被附加,例如这样。

function v_start() {
    if (!$('#next').data('click-handled')) {
        $('#next').data('click-handled', true).click(function(){
            v_check();
        });
    }
}

(您也可以手动获取事件列表并检查您的函数是否存在,但这要复杂得多。)

于 2012-04-08T12:44:22.713 回答
1

由于您v_start在每个文件中调用了两次,显然您将事件绑定了两次。您可以做一个简单的检查click事件是否已经像这样处理:

function v_start() {
    var $next = $('#next');
    $next.data('events').click || $next.click(v_check);
}
于 2012-04-08T12:53:04.673 回答
1

利用:

$( ".mybutton" ).off('click').on('click', function() { 
// same code
}); 

这对我来说是最好的解决方案,或者也是

$(".mybutton").unbind("click",myFunction).bind("click",myFunction)
于 2015-08-04T05:17:04.940 回答