Dê uma olhada neste:
(reimpresso da página expirada do blog http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ com base na versão arquivada em http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Publicar / Assinar com jQuery
17 de junho de 2008
Com o objetivo de escrever uma interface do usuário do jQuery integrada à funcionalidade off-line do Google Gears, tenho usado algum código para pesquisar o status da conexão de rede usando o jQuery.
O objeto de detecção de rede
A premissa básica é muito simples. Criamos uma instância de um objeto de detecção de rede que pesquisará uma URL em intervalos regulares. Se essas solicitações HTTP falharem, podemos assumir que a conectividade da rede foi perdida ou o servidor está inacessível no 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]);
}
});
};
};
Você pode ver a demonstração aqui. Defina seu navegador para trabalhar offline e veja o que acontece…. não, não é muito emocionante.
Trigger and Bind
O que é empolgante (ou pelo menos o que me empolga) é o método pelo qual o status é retransmitido através do aplicativo. Eu me deparei com um método amplamente discutido de implementar um sistema pub / sub usando os métodos trigger e bind do jQuery.
O código de demonstração é mais obtuso do que precisa ser. O objeto de detecção de rede publica eventos de 'status' no documento que os escuta ativamente e, por sua vez, publica eventos de 'notificação' a todos os assinantes (mais sobre os que serão posteriormente). O raciocínio por trás disso é que, em um aplicativo do mundo real, provavelmente haveria mais lógica controlando quando e como os eventos de 'notificação' são publicados.
$(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
*/
});
Devido à abordagem centrada no DOM, os eventos do jQuery são publicados para (acionados) elementos do DOM. Pode ser o objeto de janela ou documento para eventos gerais ou você pode gerar um objeto jQuery usando um seletor. A abordagem adotada na demonstração é criar uma abordagem quase espaçada para definir assinantes.
Os elementos DOM que devem ser assinantes são classificados simplesmente com "subscriber" e "networkDetection". Podemos publicar eventos apenas para esses elementos (dos quais existe apenas um na demonstração) acionando um evento de notificação em$(“.subscriber.networkDetection”)
A #notifier
div que faz parte do .subscriber.networkDetection
grupo de assinantes tem uma função anônima vinculada a ela, atuando efetivamente como ouvinte.
$('#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");
}
};
});
Então, lá vai você. É tudo bem detalhado e meu exemplo não é nada emocionante. Também não mostra nada de interessante que você possa fazer com esses métodos, mas se alguém estiver interessado em procurar na fonte, sinta-se à vontade. Todo o código está embutido no cabeçalho da página de demonstração