インライン JavaScript イベントを HTML 要素から完全にバインド解除するにはどうすればよいですか?
私はもう試した:
- body 要素からのイベントの委譲解除
- 要素からイベントのバインドを解除します
- HTML要素からイベント属性を削除することさえあります
少なくとも驚いたことに、onchange
属性 ( .removeAttr('onchange')
) を削除するだけで、イベントが再び発生するのを防ぐことができました。
<input type="text" onchange="validateString(this)"></input>
これがデリゲートで可能であることはわかっています。おそらくそれが最善の方法ですが、ここでは一緒に遊んでください。この例は、質問を提案するためだけの純粋な仮説です。
したがって、仮説的な状況は次のとおりです。
次のように、インライン HTML 属性を介して入力フィールドに関連付けられた JavaScript イベントを持つ JavaScript 検証ライブラリを作成しています。
<input type="text" onchange="validateString(this)"></input>
しかし、イベントのバインドを解除してライブラリを少し改善したいと考えています。これにより、シングルページ アプリケーションでこのライブラリを使用するユーザーがイベント ハンドラーを管理する必要がなくなり、散らかる必要がなくなります。私の仮想検証ライブラリの関数に入力イベントを接続することにより、コードをまったく. それはどれも真実ではありませんが、まともなユースケースのようです.
Hypothetical Validation Library.js の「サンプル」コードは次のとおりです。
http://jsfiddle.net/CoryDanielson/jwTTf/
テストするには、テキスト ボックスに入力し、他の場所をクリックして変更イベントを発生させます。これは、Web インスペクタを開いて [タイムライン] タブで記録した状態で行います。変更イベントを発生させた (変更イベントを複数回発生させた) 時期に関連するタイムラインの領域を強調表示すると、イベント リスナー (下のウィンドウ内) が変更イベントごとに 100 ずつ増加することがわかります。適切に管理および削除された場合、新しい入力をレンダリングする前に各イベント リスナーが適切に削除されますが、インライン JavaScript イベントでそれを適切に行う方法が見つかりませんでした。
そのコードが行うことは次のとおりです。
- onChange、input 要素が検証関数をトリガーする
- その関数は入力を検証し、成功した場合は境界線に色を付けます
次に、(メモリ リークを示すために) 1 秒後に、入力要素が同じ HTML に 100 回続けて置き換えられます。これは、単一ページ アプリ内のビューの変更をシミュレートします。これにより、DOM に 100 個の新しい eventListeners が作成され、Web インスペクタから表示できます。
- 興味深いメモ。
$('input').removeAttr('onchange');
onchange イベントが今後発生するのを実際に防ぎますが、Web インスペクタに表示される eventListener/DOM の内容をガベージ コレクションしません。
- 興味深いメモ。
このスクリーンショットは、変更イベントが 3 回発生した後のものです。毎回、100 個の新しい DOM ノードが同一の HTML でレンダリングされます。HTML をonchange
置き換える前に、各ノードからイベントのバインドを解除しようとしました。
更新:この質問に戻って、JSFiddle を使用して簡単なテストを行い、回答が有効であることを確認しました。私は「テスト」を何十回も実行してから待ちました。