2017-05-04 65 views
1

我有一些函数会将事件监听器(.click(...))添加到某些元素(以及许多其他任务中)。如何避免.click()每次使用时都会添加新的监听器

我需要多次调用此函数(例如在窗口调整大小)。 每次我调用这个函数时,监听器都会再次被添加 - 所以如果我3次调用我的函数,每次点击都会触发3次而不是一次。

我建一个simplyfied例如: https://plnkr.co/edit/5NmIruVoAknfcrRTBSYb

var clickMe = $("#clickme"); 
    function init() { 
    setTimeout(function() { 
     clickMe.click(function() { 
     $("#output").append("."); 
     }) 
    }, 100) 
    } 

    init(); 

    $("#recall").click(function() { 
    init(); 
    }); 

当然这个样本(和setTimeout的)没有任何意义,但它反映了我的代码块最好的。 是否有可能以一种方式关闭整个init函数,如果我调用它,一切都会重置?或者每次都必须使用unbind()删除事件?

+0

也许这可以帮助你。插入' clickMe.unbind(“click”);'在'clickMe.click(function()'之前'像这样https://plnkr.co/edit/iFAEantGoMyIhkYJMKwj?p=preview –

+0

如果你在版本中使用'Jquery'大于1.7,最好使用'on'' off'而不是'unbind' – Mark

+0

这个工作,Carsten,但我希望有一个更优雅的解决方案,因为我有很多元素/处理程序。 – Gerfried

回答

1

我看看你的代码,我觉得这是一个修复

如果删除单击事件

.off("click") 

,那么你可以将其添加回再次,这将始终如果将其删除它在添加之前存在。

.off("click").on("click", function() { 

以下是改变的JavaScript

$(document).ready(function() { 
    init(); 
    var clickMe = $("#clickme"); 
    function init() { 
    setTimeout(function() { 
     clickMe.off("click").on("click", function() { 
     $("#output").append("."); 
     }) 
    }, 100) 
    } 
$("#recall").click(function() { 
    init(); 
}); 
}) 
+0

好的,谢谢 - 这个作品。但仍然有点哈克。 – Gerfried

+0

是的,它是一个黑客,如果我发现一个更干净的方式,我会更新我的答案:) –

相关问题