Spójrz na to:
(przedrukowano z wygasłej strony blogu http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ na podstawie zarchiwizowanej wersji pod adresem http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Publikuj / subskrybuj za pomocą jQuery
17 czerwca 2008 r
Mając na uwadze napisanie interfejsu użytkownika jQuery zintegrowanego z funkcją offline Google Gears, bawiłem się kodem, aby sprawdzić status połączenia sieciowego za pomocą jQuery.
Obiekt wykrywania sieci
Podstawowa przesłanka jest bardzo prosta. Tworzymy instancję obiektu wykrywającego sieć, który będzie sondować adres URL w regularnych odstępach czasu. Jeśli te żądania HTTP zakończą się niepowodzeniem, możemy założyć, że połączenie sieciowe zostało utracone lub serwer jest w tej chwili niedostępny.
$.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]);
}
});
};
};
Możesz zobaczyć wersję demo tutaj. Ustaw przeglądarkę do pracy w trybie offline i zobacz, co się stanie… nie, to nie jest bardzo ekscytujące.
Trigger and Bind
To, co jest ekscytujące (a przynajmniej to, co mnie ekscytuje), to metoda, dzięki której status jest przekazywany za pośrednictwem aplikacji. Natknąłem się na szeroko dyskutowaną metodę implementacji systemu pub / sub przy użyciu metod wyzwalających i wiążących jQuery.
Kod demonstracyjny jest bardziej tępy niż powinien. Obiekt wykrywania sieci publikuje zdarzenia „status” w dokumencie, który aktywnie nasłuchuje, a z kolei publikuje zdarzenia „powiadomienie” wszystkim subskrybentom (więcej na ten temat później). Powodem tego jest fakt, że w rzeczywistej aplikacji prawdopodobnie istniałaby pewna logika kontrolująca, kiedy i jak publikowane są zdarzenia „powiadomień”.
$(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
*/
});
Ze względu na DOM podejście centryczne jQuery zdarzenia są publikowane w elementach DOM (wyzwalanych). Może to być obiekt okna lub dokumentu dla zdarzeń ogólnych lub można wygenerować obiekt jQuery za pomocą selektora. Podejście, które podjąłem w wersji demonstracyjnej, polega na stworzeniu podejścia do definiowania subskrybentów o niemal przestrzeni nazw.
Elementy DOM, które mają być subskrybentami, są po prostu klasyfikowane za pomocą „subscriber” i „networkDetection”. Następnie możemy publikować zdarzenia tylko do tych elementów (których w demie jest tylko jeden), uruchamiając powiadomienie$(“.subscriber.networkDetection”)
#notifier
Div, który jest częścią .subscriber.networkDetection
grupy abonentów ma wtedy anonimową funkcję związaną z nim, skutecznie działającą w charakterze słuchacza.
$('#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");
}
};
});
A więc proszę bardzo. To wszystko jest dość gadatliwe, a mój przykład wcale nie jest ekscytujący. Nie pokazuje też nic ciekawego, co można zrobić za pomocą tych metod, ale jeśli ktoś jest zainteresowany kopaniem źródła, nie krępuj się. Cały kod jest wbudowany w nagłówku strony demonstracyjnej