Jetez un oeil à ceci:
(réimprimé à partir de l'expiration de page de blog http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ basé sur la version archivée à http://web.archive.org/web/20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/)
Publier / Souscrire Avec jQuery
Le 17 juin, 2008
Avec une vue de la rédaction d'un jQuery UI intégré avec des fonctionnalités hors connexion de Google Gears, j'ai joué avec un peu de code pour sondage pour l'état de la connexion réseau à l'aide de jQuery.
Le Réseau De Détection D'Objet
Le principe de base est très simple. Nous créons une instance d'un réseau de détection de l'objet qui interroge une URL à intervalles réguliers. Si ces requêtes HTTP échec, on peut supposer que la connectivité réseau a été perdue, ou le serveur est tout simplement inaccessible à l'heure actuelle.
$.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]);
}
});
};
};
Vous pouvez voir la démo ici. Configurer votre navigateur pour travailler hors connexion et de voir ce qui se passe.... non, il n'est pas très passionnant.
Déclencheur et Lier
Ce qui est excitant, même si (ou au moins ce qui est excitant moi) est la méthode par laquelle l'état devient relayé par l'application. J'ai trébuché sur une grande partie de l'onu-a discuté de la méthode de la mise en œuvre d'un pub/sous-système à l'aide de jQuery de déclenchement et de lier des méthodes.
Le code de démonstration est plus obtus qu'il faut. Le réseau de détection d'objet publie "statut" des événements pour le document qui écoute activement pour eux, et à son tour, publie notifier des événements pour tous les abonnés (plus sur ceux qui plus tard). Le raisonnement derrière cela est que, dans une application réelle, il y aurait probablement plus logique de contrôler quand et comment le notifier les événements sont publiés.
$(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
*/
});
En raison de jQuery DOM approche centrée sur les événements sont publiés à (déclenché) des éléments du DOM. Cela peut être la fenêtre de document ou de l'objet pour les événements généraux ou vous pouvez générer un objet jQuery à l'aide d'un sélecteur. L'approche que j'ai pris avec la démo est de créer une presque des espaces à la définition d'abonnés.
Des éléments du DOM qui sont abonnés sont classés simplement par un "abonné" et "networkDetection". On peut alors publier uniquement sur les événements de ces éléments (dont il est seul dans la démo) par le déclenchement d'un événement de notification sur $(".subscriber.networkDetection")
L' #notifier
div qui fait partie de l' .subscriber.networkDetection
groupe d'abonnés a alors une fonction anonyme lié à elle, et agissent comme un auditeur.
$('#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");
}
};
});
Donc, là vous allez. C'est assez verbeux et mon exemple n'est pas du tout excitant. Il n'a pas également la vitrine de quelque chose d'intéressant que vous pourriez faire avec ces méthodes, mais si quelqu'un est intéressé à creuser par le biais de la source de se sentir libre. Tout le code est en ligne dans l'en-tête de la page de démonstration