検索
ホームページウェブフロントエンドjsチュートリアルjQuery イベント バインディングとデリゲート example_jquery

この記事の例では、jQuery イベントのバインディングと委任について説明します。皆さんの参考に共有してください。具体的な方法は以下の通りです。

JQuery イベントのバインディングと委任は、 on() 、 binding() 、 live() 、 delegate() 、 one() などのさまざまなメソッドを使用して実装できます。

場合によっては、次のようにイベントをバインドすることがあります:

コードをコピー コードは次のとおりです。
$("#div1").click(function() {
alert("クリック後にトリガー"); });
上記のイベント バインディングはさまざまな方法で実装できます。



1. に()

コードをコピー コードは次のとおりです:
//データパラメータなし
$("p").on("クリック", function(){
アラート( $(this).text() ); });

//データパラメータがあります
関数 myHandler(event) {
アラート(event.data.foo); }
$("p").on("click", {foo: "bar"}, myHandler)


on() に対応するのは off() で、イベント バインディングを削除するために使用されます。


コードをコピー コードは次のとおりです。var foo = function () { // 何らかのイベントを処理するコード
};
// ... これで、段落がクリックされたときに foo が呼び出されます ...
$("body").on("click", "p", foo);
// ... foo は呼び出されなくなります。
$("body").off("click", "p", foo);


off(): on() によってバインディングを削除します
one(): バインドは 1 回だけです。

2.バインド()


パラメータ: (タイプ,[データ],関数(イベントオブジェクト)) type: 1 つ以上のイベント タイプを含む文字列。複数のイベントはスペースで区切られます。たとえば、「クリック」や「送信」、またはカスタム イベント名などです。

data:event.data 属性値

としてイベント オブジェクトに渡される追加のデータ オブジェクト
fn: 一致する各要素のイベントにバインドされたハンドラー関数

(タイプ,[データ],false)
type: 1 つ以上のイベント タイプを含む文字列。複数のイベントはスペースで区切られます。たとえば、「クリック」や「送信」、またはカスタム イベント名などです。
data:event.data 属性値
としてイベント オブジェクトに渡される追加のデータ オブジェクト
false: 3 番目のパラメータを false に設定すると、デフォルトのアクションが無効になります。

複数のイベント タイプを同時にバインドします:




コードをコピー

複数のイベント タイプ/ハンドラーを同時にバインドします:

コードをコピー

コードは次のとおりです:$("button").bind({ click:function(){$("p").slideToggle();}、 Mouseover:function(){$("body").css("背景色","赤");}, Mouseout:function(){$("body").css("背景色","#FFFFFF");}
});


イベント処理の前に追加のデータを渡すことができます。

コードをコピー

コードは次のとおりです。function handler(event) { アラート(event.data.foo); } $("p").bind("click", {foo: "bar"}, ハンドラー)

false を返すことでデフォルトの動作をキャンセルし、イベントのバブリングを防ぎます。

コードをコピー

コードは次のとおりです。$("form").bind("submit", function( ) { 戻り値 false })

バインドの問題

クリック イベントがバインドされているテーブルに 10 列と 500 行がある場合、5000 個のセルを検索して走査すると、スクリプトの実行速度が大幅に低下し、5000 個の td 要素と対応するイベント ハンドラーの保存にも時間がかかります。メモリを大量に消費します (全員が物理的にドアの前に立って配達を待っているのと同じです)。

前の例に基づいて、単純なフォト アルバム アプリケーションを実装したい場合、各ページには 50 枚の写真 (50 セル) のサムネイルのみが表示され、ユーザーは「ページ x」(または「次のページ」) リンクをクリックすると、 Ajax 経由でサーバーからさらに 50 枚の写真を動的にロードします。この場合、 .bind() メソッドを使用した 50 個のセルのバインディング イベントが再び受け入れられるようです。

そうではありません。 .bind() メソッドを使用すると、クリック イベントは最初のページの 50 個のセルにのみバインドされ、動的に読み込まれる後続のページのセルにはこのクリック イベントがありません。つまり、 .bind() は、呼び出されたときにすでに存在する要素にイベントをバインドすることしかできず、将来追加される要素にイベントをバインドすることはできません (新入社員が速達配送を受け取ることができないのと同様)。

イベント委任は、上記の 2 つの問題を解決できます。コードに固有の場合は、.bind() メソッドの代わりに jQuery 1.3 で新しく追加された .live() メソッドを使用してください:

コードをコピー コードは次のとおりです:
$("#info_table td").live("click", function() {/*詳細情報を表示*/});

ここの .live() メソッドは、クリック イベントを $(document) オブジェクトにバインドします (ただし、これはコードから反映できません。これは、.live() メソッドが批判されている重要な理由でもあります。これについては後ほど説明します。詳細については後ほど説明します)。$(document) を 1 回バインドするだけで (50 回どころか 5000 回も)、その後に動的に読み込まれるフォト セルのクリック イベントを処理できます。イベントを受信すると、$(document) オブジェクトはイベント タイプとイベント ターゲットを確認し、それがクリック イベントでイベント ターゲットが td の場合、それに委任されたハンドラーが実行されます。

unbind():バインドによって実行されたバインディングを削除します。

3. ライブ()

これまでのところ、すべてが完璧に見えます。残念ながらそうではありません。 .live() メソッドは完璧ではないため、次のような大きな欠点があります:
$() 関数は、現在のページ内のすべての td 要素を検索し、jQuery オブジェクトを作成します。ただし、この td 要素コレクションは、イベント ターゲットを確認するときに使用されず、代わりにセレクター式を使用して、event.target またはその祖先と比較します。したがって、この jQuery オブジェクトを生成すると、不要なオーバーヘッドが発生します。 デフォルトでは、イベントは $(document) 要素にバインドされます。DOM の入れ子構造が非常に深い場合、多数の祖先要素を介してイベントがバブリングするとパフォーマンスが低下します。 これは、直接選択された要素の後にのみ配置でき、連続した DOM トラバーサル メソッドの後には使用できません。つまり、$("#info_table td").live... は使用できますが、$("#info_table") .find("td" ).live...いいえ;
td要素を集めてjQueryオブジェクトを作成するのですが、実際に動作するのは$(document)オブジェクトなのでわかりにくいです。
解決策
不要な jQuery オブジェクトの生成を避けるために、「早期委任」と呼ばれるハックを使用できます。これは、$(document).ready() メソッドの外側で .live() を呼び出すことです。


コードをコピーします コードは次のとおりです:(function($){ $("#info_table td").live("click",function(){/*詳細を表示*/}); })(jQuery);

ここで、(function($){...})(jQuery) は「すぐに実行される匿名関数」であり、名前の競合を防ぐためのクロージャを形成します。匿名関数内で、$parameter は jQuery オブジェクトを参照します。この匿名関数は、DOM の準備ができるまで待機せずに実行されます。このハックを使用する場合、ページの head 要素でスクリプトをリンクまたは実行する必要があることに注意してください。このタイミングを選択した理由は、この時点ではドキュメント要素が利用可能であり、スクリプトが body 終了タグの前に配置されても、DOM が完全に完了しているため意味がありません。その時点で利用可能です。
イベントのバブリングによるパフォーマンスの低下を避けるために、jQuery は 1.4 以降、.live() メソッドを使用するときにコンテキスト パラメーターの使用をサポートしています。


コードをコピー

コードは次のとおりです:$("td",$("#info_table")[0 ]). live("click",function(){/*詳細を表示*/});

このようにして、「トラスティ」がデフォルトの $(document) から $("#info_table")[0] に変更され、バブリングの手間が省けます。ただし、.live() で使用されるコンテキスト パラメーターは別の DOM 要素である必要があるため、ここでは配列インデックス演算子を使用して取得される $("#info_table")[0] を使用してコンテキスト オブジェクトを指定します。

4. デリゲート()

前述したように、単一の .bind() メソッドの制限を突破してイベント委任を実装するために、jQuery 1.3 では .live() メソッドが導入されました。その後、長すぎる「イベント伝播チェーン」の問題を解決するために、jQuery 1.4 では .live() メソッドのコンテキスト オブジェクトの指定をサポートしました。要素コレクションの不必要な生成の問題を解決するために、jQuery 1.4.2 では新しいメソッド.delegate() が導入されました。

.delegate() を使用すると、前の例は次のように記述できます:

コードをコピー コードは次のとおりです:
$("#info_table").delegate("td"," click", function(){/*詳細情報を表示*/});

.delegate() を使用すると、次のような利点があります (または、.live() メソッドの次の問題が解決されます):
ターゲット要素セレクター ("td")、イベント ("click")、およびハンドラーを "dragee" $("#info_table") に直接バインドします。追加の要素のコレクション、短縮されたイベント伝播パス、および明確なセマンティクスは必要ありません。 >

連続した DOM トラバーサル メソッドの後の呼び出しをサポートします。つまり、$("table").find("#info").delegate... をサポートし、正確な制御をサポートします。

.delegate() メソッドは比較的完璧なソリューションであることがわかります。ただし、DOM 構造が単純な場合は、.live() も使用できます。

ヒント: イベント委任を使用する場合、ターゲット要素に登録されている他のイベント ハンドラーが .stopPropagation() を使用してイベントの伝播を防止すると、イベント委任は無効になります。


undelegate(): delegate
のバインディングを削除します。

この記事が皆さんの jQuery プログラミングに役立つことを願っています。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

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

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。