これを読む前に、このイベントのリストを別のページにプルアップしてください。API自体が非常に役立ちます。以下で説明するすべてのものは、このページから直接リンクされています。
まず、.click(function)
は文字通りのショートカットです.bind('click', function)
。これらは同等です。次のように、ハンドラーを要素に直接バインドするときに使用します。
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
この要素が置換または破棄されると、このハンドラーは存在しなくなります。また、ハンドラーをアタッチするためにこのコードが実行されたときにそこになかった要素(たとえば、セレクターがそれを見つけた)は、ハンドラーを取得しません。
.live()
そして、.delegate()
同様に関連して、.delegate()
実際に使用しています.live()
彼らの両方がバブルにイベントをリッスン、内部的に。 これは新旧の要素で機能し、イベントを同じ方法でバブルします。新しい行やリストアイテムの追加など、要素が変更される可能性がある場合にこれらを使用します。ページにとどまり、どの時点でも置き換えられない親/共通の祖先がない場合は.live()
、次のように使用します。
$(".clickAlert").live('click', function() {
alert("A click happened");
});
ただし、置き換えられない場所に親要素がある場合(そのため、イベントハンドラーはバイバイではありません).delegate()
、次のようにで処理する必要があります。
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
これはとほぼ同じよう.live()
に機能しますが、イベントがキャプチャされてハンドラーが実行される前に、イベントがバブルする回数が少なくなります。これらの両方のもう1つの一般的な使用法は、要素でクラスが変更され、最初に使用したセレクターと一致しなくなったことです...これらのメソッドを使用すると、イベント時にセレクターが評価され、一致した場合、ハンドラーが実行されます。 .so要素がセレクターと一致しなくなったことが問題になり、実行されなくなります。では.click()
ただし、イベントハンドラはDOM要素にバインドされた権利であり、それはそれを見つけるために使用されたものは何でもセレクタ一致していないという事実は関係ありません...イベントがバインドされ、その要素がなくなるまでそれが滞在しています、またはハンドラを介して削除され.unbind()
ます。
まだのための別の一般的な使用.live()
とは、.delegate()
あるパフォーマンスが。多数の要素を扱う場合は、クリックハンドラーを各要素に直接アタッチすると、コストと時間がかかります。これらのケースでは、単一のハンドラーをセットアップしてバブリングで処理を実行する方が経済的です。大きな違いが生じたこの質問を見てください。これはアプリケーションの良い例です。
トリガー -更新された質問
利用可能な2つの主要なイベントハンドラートリガー関数があり、それらはAPIの同じ「イベントハンドラーアタッチメント」カテゴリに分類されます。これらは.trigger()
および.triggerHandler()
です。 .trigger('eventName')
には、一般的なイベントのショートカットがいくつか組み込まれています。次に例を示します。
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
これらのショートカットを含むリストをここで表示できます。
違いについては.trigger()
、イベントハンドラーをトリガーします(ただし、ほとんどの場合、デフォルトのアクションではありません。たとえば、クリックされたの適切な場所にカーソルを置きます<textarea>
)。これにより、イベントハンドラーがバインドされた順序で(ネイティブイベントと同じように)発生し、ネイティブイベントアクションが発生し、DOMがバブルアップします。
.triggerHandler()
通常は別の目的で使用します。ここでは、バインドされたハンドラーを起動しようとしていますが、フォームの送信など、ネイティブイベントを起動しません。これはDOMをバブルアップせず、チェーンもできません(そのイベントの最後にバインドされたイベントハンドラーが返すものは何でも返します)。たとえば、focus
イベントをトリガーしたいが実際にはオブジェクトにフォーカスを当てたくない場合、バインドしたコード.focus(fn)
を実行するだけで実行できますが、.trigger()
実際には要素にフォーカスしてバブルアップします。
これが実際の例です:
$("form").submit(); //actually calling `.trigger('submit');`
これにより、jQuery検証プラグインなどの送信ハンドラが実行され、を送信しようとし<form>
ます。しかし、あなたがいる場合だけで、それが経由フックアップなので、検証するために望んでいたsubmit
イベントハンドラが、提出していない<form>
、その後、あなたが使用することができ.triggerHandler('submit')
、このように、:
$("form").triggerHandler('submit');
プラグインは、検証チェックに合格しなかった場合に爆撃によってハンドラーがフォームを送信するのを防ぎますが、このメソッドでは、それが何をするかは気にしません。中止したかどうかに関係なく、フォームを送信しようとしていないのに、フォームをトリガーして再検証を行い、他には何もしませんでした。(免責事項:.validate()
プラグインにメソッドがあるため、これは余分な例ですが、意図の適切な例です)