Schau dir das an:
(Nachdruck von der abgelaufenen Blog-Seite http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ basierend auf der archivierten Version unter http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Veröffentlichen / Abonnieren mit jQuery
17. Juni 2008
Um eine jQuery-Benutzeroberfläche zu schreiben, die in die Offline-Funktionalität von Google Gears integriert ist, habe ich mit Code gespielt, um mithilfe von jQuery den Netzwerkverbindungsstatus abzufragen.
Das Netzwerkerkennungsobjekt
Die Grundvoraussetzung ist sehr einfach. Wir erstellen eine Instanz eines Netzwerkerkennungsobjekts, das in regelmäßigen Abständen eine URL abfragt. Sollten diese HTTP-Anforderungen fehlschlagen, können wir davon ausgehen, dass die Netzwerkverbindung unterbrochen wurde oder der Server zum gegenwärtigen Zeitpunkt einfach nicht erreichbar ist.
$.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]);
}
});
};
};
Sie können die Demo hier ansehen. Stellen Sie Ihren Browser so ein, dass er offline arbeitet und sehen Sie, was passiert. Nein, es ist nicht sehr aufregend.
Auslösen und binden
Was jedoch aufregend ist (oder zumindest was mich begeistert), ist die Methode, mit der der Status über die Anwendung weitergeleitet wird. Ich bin auf eine weitgehend unbekannte Methode zur Implementierung eines Pub / Sub-Systems mit den Trigger- und Bind-Methoden von jQuery gestoßen.
Der Demo-Code ist stumpfer als nötig. Das Netzwerkerkennungsobjekt veröffentlicht Statusereignisse in dem Dokument, das sie aktiv abhört, und veröffentlicht wiederum Benachrichtigungsereignisse für alle Abonnenten (dazu später mehr). Der Grund dafür ist, dass in einer realen Anwendung wahrscheinlich mehr Logik gesteuert wird, wann und wie die Benachrichtigungsereignisse veröffentlicht werden.
$(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
*/
});
Aufgrund des DOM-zentrierten Ansatzes von jQuery werden Ereignisse in (ausgelöst auf) DOM-Elementen veröffentlicht. Dies kann das Fenster- oder Dokumentobjekt für allgemeine Ereignisse sein oder Sie können ein jQuery-Objekt mithilfe eines Selektors generieren. Der Ansatz, den ich mit der Demo gewählt habe, besteht darin, einen fast namenlosen Ansatz für die Definition von Abonnenten zu erstellen.
DOM-Elemente, die Abonnenten sein sollen, werden einfach mit "Abonnent" und "Netzwerkerkennung" klassifiziert. Wir können dann Ereignisse nur für diese Elemente veröffentlichen (von denen es nur eines in der Demo gibt), indem wir ein Benachrichtigungsereignis für auslösen$(“.subscriber.networkDetection”)
Dem #notifier
Div, das Teil der .subscriber.networkDetection
Gruppe von Abonnenten ist, ist dann eine anonyme Funktion zugeordnet, die effektiv als Zuhörer fungiert.
$('#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");
}
};
});
Hier bitteschön. Es ist alles ziemlich ausführlich und mein Beispiel ist überhaupt nicht aufregend. Es zeigt auch nichts Interessantes, was Sie mit diesen Methoden tun könnten, aber wenn jemand überhaupt daran interessiert ist, die Quelle zu durchsuchen, fühlen Sie sich frei. Der gesamte Code befindet sich im Kopf der Demoseite