ホームページ > ウェブフロントエンド > jsチュートリアル > jQuery on()_jquery を使用して動的要素をバインドするときに発生する問題の概要

jQuery on()_jquery を使用して動的要素をバインドするときに発生する問題の概要

WBOY
リリース: 2016-05-16 15:14:49
オリジナル
1294 人が閲覧しました

jQuery on() メソッドは、イベントをバインドするために公式に推奨されるメソッドです。 on() メソッドを使用して、指定したイベントを、追加など、今後動的に作成される動的要素にバインドします。

以前に使用していたときは、常に

でした
$("").on('click','function(){ 
}') 
ログイン後にコピー

その後、ドキュメントを確認したところ、バインドできない場合があることがわかりました (要素が動的に生成される場合など)。

を使用するのが正しいことがわかりました。
$(document).on("change","#pageSize_out",function(){ 
if($("#page_out").val()!=0){ 
$("#pageSize").val($(this).val()); 
list(); 
} 
}) 
ログイン後にコピー

また、ご注意ください

この回答は多くの注目を集めているため、補足的なアドバイスを 2 つ紹介します:

1) 可能であれば、無駄なイベント処理を避けるために、イベント リスナーを最も正確な要素にバインドするようにしてください。

That is, if you're adding an element of class b to an existing element of id a, then don't use
$(document.body).on('click', '#a .b', function(){
but use
$('#a').on('click', '.b', function(){
ログイン後にコピー

2) ID を持つ要素を追加するときは、同じ ID を持つ 2 つの要素を持つことは HTML では「違法」であるだけでなく、多くの機能を壊さないように注意してください。たとえば、セレクター「#c」は、この ID を持つ要素を 1 つだけ取得します。

on(events,[selector],[data],fn)
ログイン後にコピー

events: スペースで区切られた 1 つ以上のイベント タイプと、「click」や「keydown.myPlugin」などのオプションの名前空間。
selector: イベントをトリガーしたセレクター要素のフィルターの子孫のセレクター文字列。セレクターが null であるか省略されている場合、イベントは選択された要素に到達すると常に発生します。

data: イベントがトリガーされると、event.data がイベント処理関数に渡される必要があります。

fn: イベントがトリガーされたときに実行される関数。 false 値は、false を返す関数の短縮形としても使用できます。

bind() を置き換えます

2 番目のパラメーター 'selector' が null の場合、基本的に on() と binding() の使用法に違いはありません。そのため、on() には、bind() の 'selector' パラメーターよりもオプションが 1 つ多いだけであると考えることができます。 、など on() は簡単に binding() を置き換えることができます

ライブを置換()

1.4 より前は、イベントを現在および将来の要素にバインドできるため、誰もが live() を好んで使用していたと思います。もちろん、1.4 以降では、delegate() も同様のことを実行できます。 live() の原理は非常に単純で、ドキュメントを通じてイベントを委任するため、on() を使用してイベントをドキュメントにバインドすることで live() と同じ効果を実現することもできます。

ライブの書き方()

コードは次のとおりです:

$('#list li').live('click', '#list li', function() {
//function code here.
}); 
ログイン後にコピー

on() の書き方

コードは次のとおりです:

$(document).on('click', '#list li', function() {
//function code here.
});
ログイン後にコピー

ここで重要なのは、2 番目のパラメーター 'selector' が有効であるということです。これはフィルターとして機能し、選択した要素の子孫要素のみがイベントをトリガーします。

デリゲート()を置き換えます

delegate() は、祖先要素を通じて子孫要素のイベント バインディングの問題を委任する目的で 1.4 で導入されました。これには、ある程度、live() と同様の利点があります。 live() が document 要素を通じて委任されるだけであり、デリゲートは任意の祖先ノードにすることができます。 on()を使ってプロキシを実装する場合の書き方は、基本的にdelegate()と同様です。

delegate()の書き方

コードは次のとおりです:

$('#list').delegate('li', 'click', function() {
//function code here.
});
ログイン後にコピー

on() の書き方

コードは次のとおりです:

$('#list').on('click', 'li', function() {
//function code here.
});
ログイン後にコピー

第一パラメータと第二パラメータの順序が逆になっているように見えますが、それ以外は基本的に同じです。

概要

jQuery は 2 つの目的で on() を起動しました。1 つはインターフェイスの統合で、もう 1 つはパフォーマンスの向上です。そのため、今後は on() を使用して、bind()、live()、および delegate を置き換えます。特に、 live() はすでに非推奨リストに含まれており、いつでも強制終了されるため、今後は使用しないでください。イベントを 1 回だけバインドし、one() を使用する場合、これに変更はありません。

jquery on() メソッドは動的要素をバインドします

これ以上はナンセンスです。コードを投稿させてください。

<div id="test">
<div class="evt">evt1</div>
</div>
ログイン後にコピー

使用方法が間違っています。次のメソッドは、クリック イベントをクラス evt の最初の div にバインドするだけです。append を使用して動的に作成された div はバインドされません。

<script>
// 先绑定事件再添加div
$('#test .evt').on('click', function() {alert($(this).text())});
$('#test').append('<div class="evt">evt2</div>');
</script>
ログイン後にコピー

正しい使用法は次のとおりです:

<script>
$('body').on('click', '#test .evt', function() {alert($(this).text())});
$('#test').append('<div class="evt">evt2</div>');
</script>
ログイン後にコピー
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート