jQuery では、要素にイベントをバインドできる on メソッドと、イベントを手動でトリガーできる Trigger メソッドに焦点を当てて、jQuery の Observer パターンを体験してみましょう。
■ on メソッドは組み込みイベントをバインドし、それらを自然にトリガーします
たとえば、クリックイベントをページのbody要素にバインドする場合は、次のように記述します。
上記では、本文をクリックすることによってのみクリック イベントをトリガーできます。つまり、組み込みイベントがページ要素にバインドされている場合、組み込みイベントが発生した瞬間にイベントがトリガーされます。
■ on メソッドは組み込みイベントをバインドし、手動でトリガーします
トリガー メソッドを使用すると、要素にバインドされた組み込みイベントを手動でトリガーすることもできます。
<スクリプトタイプ="text/javascript">
$(function() {
$('body').on('click', function () {
console.log('クリックされました~~');
});
$('body').trigger('click');
});
上記では、本文をクリックする必要はありません。ページが読み込まれた後、本文は自動的にクリック イベントをトリガーします。
■ on メソッドはカスタム イベントをバインドし、手動でトリガーします
click は jquery の組み込みイベントであることはわかっていますが、このイベントをカスタマイズして手動でトリガーすることはできるでしょうか。
上記では、someclick イベントをカスタマイズしました。結果は上記と同じです。
それで、カスタム イベントを要素にバインドし、trigger メソッドを使用してイベントをトリガーできることがわかりました。
もちろん、カスタム イベントの名前は、app.someclick などの「namespace.カスタム イベント名」の形式で記述することができます。これは、カスタム イベント名の競合を効果的に回避できるため、大規模なプロジェクトで特に役立ちます。
「パブリッシュとサブスクライブ」という観点から見ると、on メソッドはサブスクライバーとオブザーバーに相当し、trigger メソッドはパブリッシャーに相当します。
■「json データを非同期で取得する」から jQuery オブザーバー モードを体験
ルート ディレクトリには、data.json ファイルがあります。
{
"one" : "こんにちは"、
"two" : "世界"
}
次に、json データを非同期で取得します。
グローバル変数を使用して非同期で取得された JSON データを受け取る場合。
今回、得られた結果は未定義でした。これはなぜですか?
--$.getJSON メソッドがまだデータを取得している間に console.log(data) が実行されており、この時点ではデータが存在しないためです。
この問題を解決するにはどうすればよいですか?
上記の on メソッドはカスタム イベント app.myevent をサブスクライブするサブスクライバーに似ており、トリガー メソッドはサブスクライバー メソッドが実際に実行される前にイベントとパラメーターを公開するパブリッシャーに似ています。
■ jQuery オブザーバーパターンの拡張メソッド
この目的のために、jQuery オブザーバー パターン専用の拡張メソッドを作成することもできます。
上記は、いつでも呼び出すことができるグローバル パブリッシュ メソッドとサブスクライブ メソッドを定義しています。
要約: jQuery のオブザーバー モードでは、実際には、 on メソッドによってバインドされたカスタム イベントは、トリガー メソッドを使用してイベントをトリガーするまで実行されません。 jQuery のオブザーバー パターンを使用する利点は、一度パブリッシュし、複数回サブスクライブできることです。