0

から委任する以外に、セレクターに一致するページ上のすべての要素に対応するjQueryを使用してイベントを委任する方法はあります$(document)か?

それはおそらく言葉遣いが悪いので、ここにこすりがあります:

以前jQuery.liveは、セレクターに一致するすべての要素にイベントが委任されていました。これはjQuery.delegate、特定のコンテキストセレクター内のイベントをその子に委任することによって置き換えられましたjQuery.on。これは、実質的に同じことを実行しますが、舞台裏で異なるビットを使用するによって置き換えられました(私は想像します)。

私がやりたいのはdiv.foo、どこに住んでいるか、いつ住んでいるかに関係なく、ページ上のすべてにイベントハンドラーを安全に追加することです。.fooドキュメントと実証研究によると、以下はスクリプトの実行時に存在する要素にのみバインドされます。後でページに要素を配置する可能性のあるコードがあるため.foo、これは正確には機能しません。

jQuery('.foo').on('click', handler);

は廃止された(おそらく削除された?)のでlive、私はそれを使わないようにしていますが、私が思いつくことができる唯一の解決策は

jQuery(document).on('click', '.foo', handler);

しかし、これliveは舞台裏で最初に行われたことではありませんか?もっと要点を言えば、これを行わない重要な理由はありますか?

特にバージョン1.7.2を使用していますが、一般的なjQueryの回答も役立ちます。

4

2 に答える 2

1

ドキュメントへのバインディング(以下のように)がまさに何をするかという点であなたは正しいですlive()

jQuery(document).on('click', '.foo', handler);

これが悪い理由は、パフォーマンスがあまり良くないからです。どこでもクリックするたびdocumentに、委任された要素上にあるかどうかを確認します。

より良い方法は、document動的に追加される要素に最も近い親であるが、ページの読み込み時に利用できる要素を代わりに使用することです。これが最上位のコンテナであっても、すべてを にアタッチするよりもパフォーマンス上の利点がありますdocument

于 2013-01-14T16:28:34.277 に答える
1

イベントはソースから委任されたものにバブリングするため、最も低い共通の親であるレベルで jquery().on を使用する必要があります。それが文書なら、それでいい。

それ以外の場合、.fooアイテムが常に.foocontainer(または何か)内で作成される場合は、それらが複数ある場合でも、セレクターでそれを使用できます-単にアタッチするだけです。

ドキュメントに委任する際の問題は、イベントが何度もバブルする可能性があり、プロセスで余分なオーバーヘッドが発生する可能性があるため、イベントをできるだけソースの近くに委任するのが最善だと思います。

于 2013-01-14T16:28:47.447 に答える