将来の操作を存在しない要素にバインドすることについて多くの質問があり、最終的にlive /delegateで回答されます。セレクターに一致するすべての既存の要素と、まだ作成されていない同じセレクターに一致するすべての将来の要素に対して、任意のコールバックを実行する方法(たとえば、クラスを追加したり、プラグインをトリガーしたりする方法)を考えています。
livequery プラグインの主な機能はコアに組み込まれたようですが、任意のコールバックをアタッチする他の部分は途中で失われました。
もう 1 つの一般的な答えはイベント委任ですが、要素を作成してイベントをトリガーするすべてのベンダー コードにアクセスできない場合はどうなるでしょうか。
以下は実際のコードです。
// with livequery
$('input[type=text], input[type=password], textarea, .basic_form .block select, .order_form .form_item select, .order_form .form_item input')
.livequery(function(){
$(this)
.focus(function(){
$(this).addClass('active');
})
.blur(function(){
$(this).removeClass('active');
})
.addClass('text');
});
// with live
$('input[type=text], input[type=password], textarea, .basic_form .block select, .order_form .form_item select, .order_form .form_item input')
.live('focus', function(){
$(this).addClass('active');
})
.live('blur', function(){
$(this).removeClass('active');
});
// now how to add the class to future elements?
// (or apply another plugin or whatever arbitrary non-event thing)
1 つのアプローチは、新しいノードがいつ追加/削除されたかを監視し、セレクターを再トリガーすることです。@arnorhsのおかげで、私はDOMNodeInsertedイベントについて知っています。これらの小さな IE パッチがいつか jQuery のアップストリームに到達するか、jQuery DOM 関数がラップされる可能性があることを知っていることを期待して、クロスブラウザーの問題を無視します。
ただし、DOMNodeInserted がクロスブラウザーを起動したことを確認できたとしても、複数のセレクターでそれにバインドするのはばかげています。いつでも何百もの要素を作成することができ、これらの要素のそれぞれに対して潜在的に数十のセレクター呼び出しを行うとクロールします。
これまでの私の最高のアイデア
DOMNodeInserted/Deleted を監視するか、jQuery の DOM 操作ルーチンにフックして、「再初期化」が発生するフラグのみを設定する方がよいでしょうか? 次に、そのフラグをx秒ごとにチェックするタイマーがあり、DOMが実際に変更されたときにのみ、これらすべてのセレクター/コールバックを実行します。
大量の要素を高速で追加/削除している場合 (アニメーションや ____ のように)、これはまだ非常に悪い可能性があります。保存されたセレクターごとに x 秒ごとに 1 回 DOM を再解析する必要があるのは、x が低い場合は負荷が高すぎる可能性があり、x が高い場合はインターフェースが遅く見える可能性があります。
他の新しいソリューションはありますか?
気が向いたら賞金を追加します。最も斬新な解決策に報奨金を追加しました!
基本的に私が得ているのは、DOM を操作するためのよりアスペクト指向のアプローチです。新しい要素が将来作成されることを可能にするもので、最初の document.ready 変更も適用して作成する必要があります。
JS は最近非常に多くの魔法を行うことができたので、それが明らかになることを願っています。