Mira esto:
(reimpreso de la página caducada del blog http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ basado en la versión archivada en http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Publicar / Suscribirse con jQuery
17 de junio de 2008
Con miras a escribir una interfaz de usuario jQuery integrada con la funcionalidad fuera de línea de Google Gears, he estado jugando con algún código para sondear el estado de la conexión de red usando jQuery.
El objeto de detección de red
La premisa básica es muy simple. Creamos una instancia de un objeto de detección de red que sondeará una URL a intervalos regulares. Si estas solicitudes HTTP fallan, podemos suponer que se ha perdido la conectividad de la red o que el servidor simplemente no está disponible en este momento.
$.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]);
}
});
};
};
Puedes ver la demostración aquí. Configure su navegador para que funcione sin conexión y vea qué sucede ... No, no es muy emocionante.
Disparador y enlace
Sin embargo, lo que es emocionante (o al menos lo que me emociona) es el método por el cual el estado se transmite a través de la aplicación. Me topé con un método en gran parte no discutido para implementar un sistema pub / sub utilizando los métodos de activación y vinculación de jQuery.
El código de demostración es más obtuso de lo necesario. El objeto de detección de red publica eventos de 'estado' en el documento que los escucha activamente y, a su vez, publica eventos de 'notificación' a todos los suscriptores (más sobre eso más adelante). El razonamiento detrás de esto es que en una aplicación del mundo real probablemente habría algo más de control lógico cuándo y cómo se publican los eventos de 'notificación'.
$(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
*/
});
Debido al enfoque centrado en DOM de jQuery, los eventos se publican en elementos DOM (activados). Este puede ser el objeto de ventana u documento para eventos generales o puede generar un objeto jQuery usando un selector. El enfoque que he tomado con la demostración es crear un enfoque casi espaciado de nombres para definir suscriptores.
Los elementos DOM que serán suscriptores se clasifican simplemente con "suscriptor" y "networkDetection". Entonces podemos publicar eventos solo en estos elementos (de los cuales solo hay uno en la demostración) activando un evento de notificación en$(“.subscriber.networkDetection”)
El #notifier
div, que forma parte del .subscriber.networkDetection
grupo de suscriptores, tiene una función anónima vinculada a él, actuando efectivamente como un oyente.
$('#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");
}
};
});
Ahí vas. Todo es bastante detallado y mi ejemplo no es nada emocionante. Tampoco muestra nada interesante que pueda hacer con estos métodos, pero si alguien está interesado en profundizar en la fuente, siéntase libre. Todo el código está en línea en la cabecera de la página de demostración.