Guarda questo:
(ristampato dalla pagina del blog scaduta http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ in base alla versione archiviata su http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Pubblica / Iscriviti con jQuery
17 giugno 2008
Al fine di scrivere un'interfaccia utente jQuery integrata con la funzionalità offline di Google Gears, ho giocato con un po 'di codice per sondare lo stato della connessione di rete usando jQuery.
L'oggetto di rilevamento della rete
La premessa di base è molto semplice. Creiamo un'istanza di un oggetto di rilevamento della rete che eseguirà il polling di un URL a intervalli regolari. Se queste richieste HTTP falliscono, possiamo supporre che la connettività di rete sia andata persa o che al momento il server non sia semplicemente raggiungibile.
$.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]);
}
});
};
};
Puoi vedere la demo qui. Imposta il tuo browser in modo che funzioni offline e vedi cosa succede ... no, non è molto eccitante.
Trigger and Bind
Ciò che è eccitante (o almeno ciò che mi eccita) è il metodo con cui lo stato viene trasmesso attraverso l'applicazione. Mi sono imbattuto in un metodo ampiamente discusso di implementazione di un pub / sottosistema usando i metodi trigger e bind di jQuery.
Il codice demo è più ottuso di quanto debba essere. L'oggetto di rilevamento della rete pubblica eventi di "stato" nel documento che li ascolta attivamente e, a sua volta, pubblica eventi di "notifica" a tutti gli abbonati (ne parleremo più avanti). Il ragionamento alla base di ciò è che in un'applicazione del mondo reale ci sarebbe probabilmente qualche logica in più che controlla quando e come vengono pubblicati gli eventi di "notifica".
$(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
*/
});
A causa dell'approccio incentrato sul DOM di jQuery, gli eventi vengono pubblicati su (attivati) elementi DOM. Può essere l'oggetto finestra o documento per eventi generali oppure è possibile generare un oggetto jQuery utilizzando un selettore. L'approccio che ho adottato con la demo è quello di creare un approccio quasi spaziale alla definizione degli abbonati.
Gli elementi DOM che devono essere abbonati vengono classificati semplicemente con "abbonato" e "networkDetection". Possiamo quindi pubblicare eventi solo su questi elementi (di cui ce n'è solo uno nella demo) attivando un evento di notifica$(“.subscriber.networkDetection”)
Il #notifier
div che fa parte del .subscriber.networkDetection
gruppo di abbonati ha quindi una funzione anonima ad esso associata, che agisce efficacemente come ascoltatore.
$('#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");
}
};
});
Quindi, eccoti. È tutto piuttosto prolisso e il mio esempio non è affatto eccitante. Inoltre, non mostra nulla di interessante che potresti fare con questi metodi, ma se qualcuno è interessato a scavare nella fonte sentiti libero. Tutto il codice è in linea nella testa della pagina demo