たとえば、次のイベントがバインドされているリンクがある場合:
$("a.d").bind("click", this, onDelete);
そして後で行います:
$("a.d").remove();
大丈夫ですか?または、メモリリークが発生し、unbind 1stを呼び出す必要がありますか?
助けてくれてありがとう。
たとえば、次のイベントがバインドされているリンクがある場合:
$("a.d").bind("click", this, onDelete);
そして後で行います:
$("a.d").remove();
大丈夫ですか?または、メモリリークが発生し、unbind 1stを呼び出す必要がありますか?
助けてくれてありがとう。
remove()のjQueryドキュメントから
一致したすべての要素をDOMから削除します。これにより、jQueryオブジェクトからそれらが削除されることはなく、一致した要素をさらに使用できるようになります。1.2.2以降のこの関数は、すべてのイベントハンドラーと内部的にキャッシュされたデータも削除することに注意してください。
私はそれをテストしていませんが、要素を削除するとそのイベントハンドラーのバインドが解除されると思います。DOMのある部分から別の部分に要素を移動したい場合は次のように述べているjQueryAPIドキュメント(removeを検索)からこの結論に達しました。
$("#foo").remove().appendTo("#bar");
次のように書く必要があります
$("#foo").appendTo("#bar");
イベントハンドラーを失うことを避けるため。
イベントがjQueryで添付されている限り、答えは「はい」です。「onclick」のようなものが付いていると、そうなるとは思いません。
この記事では、そのいくつかについて説明します。また、要素とそのすべての子のすべてのクリックイベントを削除する再帰関数も定義します。jQueryクリックハンドラーとonclickで定義されたハンドラーについて説明しているので、ここで説明します。
http://www.computerhowtoguy.com/how-to-use-the-jquery-unbind-method-on-all-child-elements/
function RecursiveUnbind($jElement) {
// remove this element's and all of its children's click events
$jElement.unbind();
$jElement.removeAttr('onclick');
$jElement.children().each(function () {
RecursiveUnbind($(this));
});
}
前の例の関数を使用するには、関数を呼び出して、jQueryオブジェクトとして「container」divを渡します。
RecursiveUnbind($('#container'));
記録のために、javascriptのメモリリークについて心配する必要はありません。(c ++ではなくチルマン!)
ブラウザのjavascriptエンジンがすべてのオブジェクトを管理し、ガベージがそれらを収集します。私がオブジェクトと言うとき、それはイベント処理関数も意味します。なぜなら、関数もjavascriptのオブジェクトだからです。
無関係:私はすべてがjavascriptのオブジェクトである方法が大好きです:D
乾杯!
jrh