看看这个:
(根据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的trigger和bind方法实现发布/订阅系统的未曾讨论过的方法。
演示代码比实际需要的更加笨拙。网络检测对象将“状态”事件发布到主动侦听它们的文档,然后将“通知”事件发布给所有订户(稍后会详细介绍)。其背后的原因是,在现实世界的应用程序中,可能会有更多逻辑来控制何时以及如何发布“通知”事件。
$(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”进行分类。然后,通过触发以下事件的通知事件,我们可以将事件仅发布到这些元素(演示中只有一个)$(“.subscriber.networkDetection”)
然后#notifier
,属于.subscriber.networkDetection
订户组的div 绑定了一个匿名函数,有效地充当了侦听器。
$('#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");
}
};
});
所以,你去了。一切都很冗长,我的例子一点也不令人兴奋。它也没有展示您可以使用这些方法做的任何有趣的事情,但是,如果有任何人有兴趣挖掘源代码,可以自由使用。所有代码均内嵌在演示页面的开头