特に、一度だけ実行されるため、バインド解除のポイントがわかりません(イベントハンドラーや投稿したものから他のものにアタッチされていません)。
私は@Beetrootに同意する傾向があります-Beetrootは、それらを互いにトグルさせようとしないことに関して、Beetrootの答えです。しかし、学習の観点から、私はあなたがやろうとしたことの根本的な問題を指摘します。
基本的な問題は、実行時にこれらの要素に直接バインドしていることです。click
バインドが設定されると、つまり、これらのdivにアタッチされているクラスを変更しても、バインド自体は同じ要素にアタッチされたままになります。これは基本的に、最初のイベントハンドラーのみが何かにアタッチされていることを意味します。これは、呼び出した時点で2番目のイベントハンドラーに一致するものがなかったためです。また、最初のイベントハンドラーを実行してクラスを切り替えた後でも、すべてに接続されているのは1つだけです。
うまくいけば、それは理にかなっています。
これがあなたが書いたものとそれがどのように壊れるかを示すフィドルです
イベントバブリングを使用する必要があります。イベントハンドラーを、これらをカプセル化して動的ではない要素にアタッチし、ハンドラーが実際に呼び出されたものの動的プロパティに基づいて決定を下すことができます。
これを行う方法は、を使用することです.on()
(ドキュメントを参照)
.on
これは、次のスクリプトで使用するフィドルです。
$('.wrapper').on('click', ".entry .tog", function() {
$(this).closest(".entry").toggleClass("entry-active entry");
$(".entry").toggleClass("entry not-active");
alert("open");
});
$('.wrapper').on('click', ".entry-active .tog", function() {
$(this).closest(".entry-active").toggleClass("entry-active entry");
$(".not-active").toggleClass("not-active entry");
alert("close");
});
基本的に、.wrapper
すべてのエントリとトグを保持するdivにアタッチするクラスを作成しました。イベントハンドラーをそれにバインドし.on()
ました。1つのバインディングには最初のクラスセットのセレクターがあり、別のバインディングには2番目のセットがあります。
私はまだ@Beetrootをお勧めします-Beetrootの答えですが、これがここで何が起こったのか、なぜそれが機能しなかったのか、そして将来同様の問題を解決する方法を理解するのに役立つことを願っています。