2017-05-04 26 views
1

を使用するたびに、私は(他の多くのタスクの中で)いくつかの要素にイベントリスナー(.click(...))を追加する機能を持つ新しいリスナーを追加します。は)それが

この関数を複数回呼び出す必要があります(たとえば、ウィンドウのサイズを変更する場合) たびに私は、リスナーが再び追加され、この関数を呼び出す - ので、私は私の機能を3回呼び出す場合、各クリックではなく1時間で3回発生します。私はsimplyfied例構築してい

:このサンプル(とのsetTimeout)もちろん https://plnkr.co/edit/5NmIruVoAknfcrRTBSYb

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

    init(); 

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

は意味がありませんが、それは最高の私のコードブロックを反映しています。 私はそれを呼び出すとすべてがリセットされるようにinit関数全体を閉じることはできますか?または、毎回unbind()でイベントを削除する必要がありますか?

+0

です。 ( "クリック") ' clickMe.unbindを挿入します;' '前clickMe.click(関数()'このようhttps://plnkr.co/edit/iFAEantGoMyIhkYJMKwj?p=preview –

+0

バージョンで 'Jquery'を使用している場合、 1.7より大きい場合、 'unbind'ではなく' on'' off'を使用する方が良いでしょう – Mark

+0

これはうまくいきますが、私は要素/ハンドラがたくさんあるのでより洗練されたソリューションがあることを願っています – 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

ok、ありがとう - これは動作します。しかし、まだ少しハッキー。 – Gerfried

+0

うん、それは私がそれを行うためのクリーンな方法を見つけた場合、私は私の答えを更新する、ハックのビットです:) –