ホームページ ウェブフロントエンド jsチュートリアル jQuery_jquery の .bind()、.live()、および .delegate() の違いの分析

jQuery_jquery の .bind()、.live()、および .delegate() の違いの分析

May 16, 2016 pm 06:06 PM
bind live

DOM ツリー

まず、HMTL ドキュメントの DOM ツリーを視覚化すると役立ちます。単純な HTML ページは次のようになります:
jQuery_jquery の .bind()、.live()、および .delegate() の違いの分析
イベントバブリング (イベント伝播とも呼ばれます)
リンクをクリックすると、リンク要素のクリック イベントがトリガーされ、その要素のクリック イベントにバインドされた関数の実行がトリガーされます。
コードをコピー コードは次のとおりです。

$('a').bind( 'クリック' ,function(){alert('くすぐったい!')})

クリック操作によりアラート機能の実行がトリガーされます。
jQuery_jquery の .bind()、.live()、および .delegate() の違いの分析
クリック イベントはツリーのルートに向かって伝播し、親要素にブロードキャストされ、次に子孫要素の 1 つでクリック イベントがトリガーされる限り、イベントは に渡されます。それ。
jQuery_jquery の .bind()、.live()、および .delegate() の違いの分析
DOM の操作のコンテキストでは、ドキュメントはルート ノードです。
これで、.bind()、.live()、.delegate() の違いをより簡単に説明できるようになりました。
.bind()
コードをコピー コードは次のとおりです:
$('a' ).bind ('click',function(){alert('くすぐったい!');})

これは最も単純なバインド方法です。 JQuery はドキュメントをスキャンしてすべての $('a') 要素を検索し、アラート関数を各要素のクリック イベントにバインドします。
.live()
コードをコピー コードは次のとおりです:
$('a' ).live ('click',function(){alert('That niceles!')})

JQuery は、alert 関数を $(document) 要素にバインドし、'click' と 'a' を次のように使用します。パラメータ 。イベントがドキュメント ノードに到達するたびに、イベントがクリック イベントであるかどうかがチェックされ、イベントのターゲット要素が 'a' CSS セレクターと一致するかどうかがチェックされ、一致する場合は関数が実行されます。
ライブ メソッドは、次のようにドキュメントの代わりに特定の要素 (または「コンテキスト」) にバインドすることもできます。
コードをコピー コードは次のとおりです:
$('a',$('#container')[0]).live('click',function(){alert('くすぐったい! ')} )

.delegate()
コードをコピー コードは次のとおりです:
$('#container').delegate('a','click',function(){alert('くすぐったい!')})


JQuery はドキュメントをスキャンして $ を見つけます('#container')、クリック イベントと 'a' CSS セレクターをパラメーターとして使用して、アラート関数を $('#container') にバインドします。イベントが $('#container') までバブルするたびに、イベントがクリック イベントであるかどうか、およびイベントのターゲット要素が CSS セレクターと一致するかどうかがチェックされます。両方のチェックの結果が true の場合、関数が実行されます。
このプロセスは .live() に似ていますが、ハンドラーをドキュメントではなく特定の要素にバインドすることに注意してください。精通した JS なら、 $('a').live() == $(document).delegate('a') と結論付けるかもしれませんね。
.delegate() が .live() よりも優れている理由
いくつかの理由により、人々は通常、ライブ メソッドの代わりに jQuery のデリゲート メソッドを使用することを好みます。次の例を考えてみましょう:
コードをコピー コードは次のとおりです:
$('a')。 live(' click', function() { blah() });
または
$(document).delegate('a', 'click', function() { blah() });
後者はスキャンする必要があるため、実際には前者よりも高速です。全体 ドキュメントはすべての $('a') 要素を検索し、それらを jQuery オブジェクトとして保存します。 live 関数は、後の判断のために文字列パラメーターとして 'a' を渡すだけで済みますが、$() 関数は、リンクされたメソッドが .live() になることを「認識」しません。

一方、デリゲート メソッドは $(document) 要素を検索して保存するだけで済みます。
この問題を回避する 1 つの方法は、$(document).ready() の外側でライブ バインドを呼び出して、すぐに実行されるようにすることです。この方法では、DOM が設定される前に実行されるため、要素が検出されたり、jQuery オブジェクトが作成されたりすることはありません。
柔軟性とチェーン機能
ライブ機能も非常にわかりにくいです。考えてみてください。これは $('a') オブジェクトのセットにリンクされていますが、実際には $(document) オブジェクトに対して動作します。このため、恐ろしい方法でメソッドを自分自身に連鎖させようとする可能性があります。実際、私が言いたいのは、live メソッドは $.live('a',...) の形式のグローバル jQuery メソッドとしてより意味があるということです。
CSS セレクターのみをサポートします
最後に、ライブ メソッドには非常に大きな欠点があります。つまり、直接 CSS セレクターでしか動作できないため、柔軟性が非常に低くなります。
CSS セレクターの欠点について詳しくは、「jQuery .live() および .die() の探索」の記事を参照してください。
更新: この次のセクションを含めるように思い出させてくれた Hacker News の Pedalpete と以下のコメントの Ellsass に感謝します。
.bind() の代わりに .live() または .delegate() を選択する理由
結局のところ、bind の方が明確で直接的だと思いませんか? さて、bind の代わりに delegate または live を選択する理由は 2 つあります。
1. DOM にまだ存在しない DOM 要素にハンドラーをアタッチします。バインドはハンドラーを個々の要素に直接バインドするため、ページ上にまだ存在しない要素にハンドラーをバインドすることはできません。
2. $('a').bind(…) を実行し、AJAX 経由でページに新しいリンクが追加された場合、バインド ハンドラーはこれらの新しく追加されたリンクに対して無効になります。一方、Live と delegate は別の祖先ノードにバインドされているため、その祖先要素内に現在存在する、または今後存在するすべての要素に対して有効です。
3. または、単一の要素または要素の小さなグループにハンドラーをアタッチするには、ループして同じ関数を DOM 内の 100 個の要素に 1 つずつアタッチする代わりに、子孫要素のイベントをリッスンします。ページ内のすべての要素にハンドラーを直接アタッチするよりも、ハンドラーを 1 つ (または少数の) 祖先要素にアタッチするとパフォーマンス上の利点があります。
拡散をやめてください
最後に注意したいのは、イベントの伝播に関するものです。通常、次のようなイベント メソッドを使用してハンドラー関数の実行を終了できます。
コードをコピー コードは次のとおりです。 :

$('a').bind('click',function(e){
e.preventDefault()
e.stopPropagation()}
)

ただし、ライブ メソッドまたはデリゲート メソッドを使用する場合、ハンドラー関数は実際には実行されておらず、ハンドラーが実際にバインドされている要素にイベントがバブルされるまで待機する必要があります。この時点で、.bind() の他のハンドラー関数はすでに実行されています。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

0x87dd0019 Xbox ログイン エラーを修正する方法 0x87dd0019 Xbox ログイン エラーを修正する方法 Mar 22, 2024 pm 02:30 PM

この記事では、Xbox Live への接続または Xbox One へのログイン時に接続タイムアウトの問題を引き起こす 0x87dd0019 Xbox ログイン エラーを修正する方法を説明します。 Xbox のエラー コード 0x87e00019 とは何ですか? Xbox 本体でゲームをインストールまたは更新するときにエラー コード 0x87e00019 が発生した場合は、Xbox ハード ドライブの記憶域スペースが不足しているか、ほぼいっぱいである可能性があります。この問題を解決するには、ストレージ領域を解放する必要があります。同時に、Xbox Live サービスのステータスも確認する必要があります。このエラーは Xbox サーバーの問題が原因である可能性があります。これらのヒントを使用して 0x87dd0019 Xbox ログイン エラーを修正する方法

PHP 致命的エラーの解決策: 未定義関数 ldap_bind() の呼び出し PHP 致命的エラーの解決策: 未定義関数 ldap_bind() の呼び出し Jun 22, 2023 pm 11:37 PM

PHP を使用して Web アプリケーションを開発する場合、多くの場合、アプリケーションのアクセスを保護するために LDAP 認証を使用する必要があります。ただし、場合によっては、PHP の LDAP 機能を使用して認証を実装しようとすると、次のエラー メッセージが表示されることがあります。このエラー メッセージは通常、アプリケーションが ldap_bind() 関数を呼び出したときに発生します。

Linuxバインドとは何ですか Linuxバインドとは何ですか Mar 25, 2023 am 09:39 AM

Linux のバインドは、キーボード キーとその関連機能を表示または設定するために使用されるコマンドです。バインド コマンドを使用すると、キーの組み合わせとその機能を理解したり、使用するキーの組み合わせを指定したりできます。その使用構文は「bind [ -dlv][ -f <...>][-m <...>][-q <...>]"。

win10 で Xbox Live にログインできない場合はどうすればよいですか? Win10 が Xbox Live ソリューションにログインできない win10 で Xbox Live にログインできない場合はどうすればよいですか? Win10 が Xbox Live ソリューションにログインできない Feb 15, 2024 am 11:51 AM

Xbox は Microsoft 独自のネットワーク サービス センターです。多くのユーザーは、Win10 コンピューターでプレイ中に Xbox Live にログインできないことに気づきました。このサイトはwin10でxboxliveにログインできない問題の解決策をユーザーに丁寧に紹介しましょう。 Windows 10 で xboxlive にログインできない問題の解決策: 1. 「win+R」ショートカット キーでファイル名を指定して実行ウィンドウを開き、「services.msc」と入力し、Enter キーを押して開きます。 2. [サービス] ウィンドウ インターフェイスに入ったら、右側で [xboxlive 認証マネージャー] を見つけ、ダブルクリックして開きます。

プレミアはライブを意味しますか? プレミアはライブを意味しますか? Apr 04, 2025 am 12:07 AM

「プレミア」と「ライブ」はビデオ制作に異なる意味を持っています。「プレミア」とは、最初のリリースまたはプレミアを指し、「ライブ」とはリアルタイムでライブブロードキャストを指します。 1。「Premiere」は、事前に録音されたコンテンツの最初の表示です。 2. Adob​​e PremiereProでプレミアを設定するには、編集、編集、レンダリング、プレミア時間のスケジュールが含まれます。 3. Pythonスクリプトを使用して、ビデオプレミアをスケジュールします。 4.重要な手順には、エクスポート設定、時間同期、プレビューテストが含まれます。 5。課題には、パフォーマンスの問題、時間管理、プラットフォームの互換性が含まれます。

JS でのバインドの実装と使用 JS でのバインドの実装と使用 Feb 24, 2024 pm 01:33 PM

JS でのバインドの実装と使用 JavaScript では、バインドは非常に便利な関数メソッドです。新しい関数を作成し、その関数が呼び出されるときに、その関数が特定の this 値を持ち、指定されたパラメーターを渡すことができることを保証します。バインド メソッドは次のように定義されます: functionbind(fn,obj,...args){returnfunction(...args2){return

Xbox コンテンツのダウンロード時のエラー 0x87e107d1 Xbox コンテンツのダウンロード時のエラー 0x87e107d1 Feb 22, 2024 am 09:50 AM

本体に Xbox コンテンツをダウンロード中にエラー コード 0x87e107d1 が発生した場合、問題を解決するにはいくつかの手順が必要になる場合があります。通常、このエラーは、ユーザーが Xbox ゲーム コンソールにコンテンツをダウンロードしようとすると表示されます。次に、この問題を解決し、必要なコンテンツを確実にダウンロードできるようにするいくつかの方法を検討します。 Xbox コンテンツをダウンロードするときにエラー 0x87e107d1 を修正する Xbox コンテンツをダウンロードするときにエラー 0x87e107d1 が発生する場合は、次の修正を使用して問題を解決します。 Xbox Live サービスのステータスを確認する インターネット接続を確認する Xbox 本体の電源をオフにしてからオンにする コンテンツを再ダウンロードしてみる プロフィールを削除して追加する 始めましょう。 1] Xboxを確認してください

Xbox パーティー チャットの音声が中断される、または機能しない [修正] Xbox パーティー チャットの音声が中断される、または機能しない [修正] Feb 19, 2024 am 11:18 AM

Xbox Party の使用中にチャットの音声が途切れたり機能しないという問題が発生した場合は、インターネット接続が不安定であるか、Xbox Live サービスの障害が原因である可能性があります。この記事は、これらの問題を解決し、Xbox Party ゲーム チャットをスムーズに実行できるようにするのに役立ちます。 Xbox パーティー チャットの音声が途切れたり機能しない問題を修正する Xbox パーティー チャットの音声が途切れたり機能しない問題を修正するには、次の修正を使用します。 XboxLive サービスのステータスを確認する インターネット接続を確認する Xbox 本体の電源をオフにしてから再度オンにする NAT の種類を確認する パーティーから退出して再参加する工場出荷時 Xbox 本体をリセットして、始めましょう。 1] XboxLive サービスのステータスを確認し、トラブルシューティングを続行します

See all articles