これをみて:
(http://web.archive.org/webのアーカイブバージョンに基づいて、期限切れのブログページhttp://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/から転載/20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/)
jQueryで公開/購読
2008年6月17日
Google Gearsのオフライン機能と統合されたjQuery UIを作成するために、jQueryを使用してネットワーク接続ステータスをポーリングするコードをいじっています。
ネットワーク検出オブジェクト
基本的な前提は非常に単純です。定期的にURLをポーリングするネットワーク検出オブジェクトのインスタンスを作成します。これらのHTTP要求が失敗した場合は、ネットワーク接続が失われたか、現時点でサーバーが単に到達不能であると想定できます。
$.networkDetection = function(url,interval){
var url = url;
var interval = interval;
online = false;
this.StartPolling = function(){
this.StopPolling();
this.timer = setInterval(poll, interval);
};
this.StopPolling = function(){
clearInterval(this.timer);
};
this.setPollInterval= function(i) {
interval = i;
};
this.getOnlineStatus = function(){
return online;
};
function poll() {
$.ajax({
type: "POST",
url: url,
dataType: "text",
error: function(){
online = false;
$(document).trigger('status.networkDetection',[false]);
},
success: function(){
online = true;
$(document).trigger('status.networkDetection',[true]);
}
});
};
};
ここでデモを見ることができます。オフラインで動作するようにブラウザーを設定し、何が起こるかを確認してください…。いいえ、それほど刺激的ではありません。
トリガーとバインド
しかし、わくわくするのは(または少なくとも私をわくわくさせるのは)、ステータスがアプリケーションを介して中継される方法です。私は、jQueryのトリガーおよびバインドメソッドを使用してpub / subシステムを実装する、ほとんど議論されていない方法に遭遇しました。
デモコードは必要以上に鈍いです。ネットワーク検出オブジェクトは、それらにアクティブにリッスンするドキュメントに「ステータス」イベントを発行し、次にすべてのサブスクライバーに「通知」イベントを発行します(後で詳しく説明します)。これの背後にある理由は、実際のアプリケーションでは、「通知」イベントがいつ、どのように発行されるかを制御するロジックがおそらく存在することです。
$(document).bind("status.networkDetection", function(e, status){
// subscribers can be namespaced with multiple classes
subscribers = $('.subscriber.networkDetection');
// publish notify.networkDetection even to subscribers
subscribers.trigger("notify.networkDetection", [status])
/*
other logic based on network connectivity could go here
use google gears offline storage etc
maybe trigger some other events
*/
});
jQueryのDOM中心のアプローチのため、イベントはDOM要素に発行(トリガー)されます。これは、一般的なイベントのウィンドウまたはドキュメントオブジェクトにすることも、セレクターを使用してjQueryオブジェクトを生成することもできます。私がデモで取ったアプローチは、サブスクライバーを定義するためのほとんど名前空間の付いたアプローチを作成することです。
サブスクライバーとなるDOM要素は、単に「サブスクライバー」と「networkDetection」で分類されます。次に、通知イベントをトリガーすることにより、これらの要素(デモには1つのみ)にのみイベントを発行できます。$(“.subscriber.networkDetection”)
#notifier
一部であるdiv要素.subscriber.networkDetection
の加入者のグループは、効果的にリスナーとして動作し、それに結合された無名関数を持っています。
$('#notifier').bind("notify.networkDetection",function(e, online){
// the following simply demonstrates
notifier = $(this);
if(online){
if (!notifier.hasClass("online")){
$(this)
.addClass("online")
.removeClass("offline")
.text("ONLINE");
}
}else{
if (!notifier.hasClass("offline")){
$(this)
.addClass("offline")
.removeClass("online")
.text("OFFLINE");
}
};
});
さあ、行きます。それはすべてかなり冗長で、私の例はまったくエキサイティングではありません。また、これらのメソッドを使用して実行できる興味深いことは何も示されていませんが、ソースを掘り下げることに興味がある場合は、自由に感じてください。すべてのコードはデモページの先頭にインラインで表示されます