2017-05-04 30 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

是的,它是一個黑客,如果我發現一個更乾淨的方式,我會更新我的答案:) –

相關問題