2012-07-23 18 views
6

jqueryの空の関数とイベントハンドラ

"To avoid memory leaks, jQuery removes other constructs such as data and event handlers 
from the child elements before removing the elements themselves." 

テキストは言います: "... jQueryは!CHILD!要素からイベントハンドラを削除します..."。しかし、私は、イベントハンドラもdivタグ($( "#mydiv")空から削除されたい)。私は "削除"機能があることを知っていますが、私の意図はdivタグを削除しないことです。これを行うための最善の方法は何ですか?

もう1つは:
「イベントハンドラを削除する」と言ったとき。彼らは "bind"で作られたコンストラクトだけを削除するのですか?あるいは "delegate"で作られたコンストラクトも削除しますか?要素からすべてのバインドされたイベントハンドラを削除するにはたくさん事前

答えて

8

おかげで、あなたはoff()方法に特別な値"*"を渡すことができます:ドキュメントがremove events handlers言うとき

$("#mydiv").empty().off("*"); 

、それだけで話しますイベントハンドラであり、が委任されていません.は、削除によって影響を受けない祖先要素(またはドキュメント自体)にバインドされているためです。

これにより、削除された要素が後で元に戻された場合でも、委託ハンドラが意図したとおりに動作することができます。

+1

これを明確にする:*「イベントハンドラを削除する」と言ったとき。 「バインド」で作成されたコンストラクトだけを削除するのか、「デリゲート」で作成したコンストラクトも削除しますか?*委任されているかどうかにかかわらず、すべてのイベントハンドラが削除されます。 I. '$("#mydiv ")。delegate(" div "、" click "、fn).off(" * ")' .delegate'で添付されたハンドラは、要素上にあったため削除されます。 – Esailija

0

私はあなたがdivタグを削除したくない正しく読めば、あなただけ(.emptyを組み合わせ、その場合には、すべてのデータとハンドラを削除する):

http://api.jquery.com/unbind/ 

しかし次の点に注意してください " .bind()を使用してイベントハンドラを削除するには、.unbind()を使用します(jQuery 1.7以降では、要素のイベントハンドラを追加および削除するには.on()および.off()メソッドが優先されます)。引数なしで.unbind()は、要素に接続されているすべてのハンドラを削除します。 "

イベントをバインドする方法に対応する削除ツールを使用します。

削除したい要素も.empty()を使用しないようにするには、代わりに.remove()を使用します。 ()、.remove()メソッドは、DOMのうちの要素をとる。.emptyする

http://api.jquery.com/remove/ 

「類似使用.remove()あなたはその中の要素自体だけでなく、すべてのものを削除したいとき。要素自体に加えて、要素に関連付けられたすべてのバインドされたイベントとjQueryデータが削除されます。データとイベントを削除せずに要素を削除するには、代わりに.detach()を使用してください。

1

このjQueryコードを試してみてください。

関連する問題