Regarde ça:
(réimprimé de la page du blog expiré http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ sur la base de la version archivée à http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Publier / S'abonner avec jQuery
17 juin 2008
En vue d'écrire une interface utilisateur jQuery intégrée à la fonctionnalité hors ligne de Google Gears, j'ai joué avec du code pour interroger l'état de la connexion réseau à l'aide de jQuery.
L'objet de détection de réseau
Le principe de base est très simple. Nous créons une instance d'un objet de détection de réseau qui interrogera une URL à intervalles réguliers. Si ces requêtes HTTP échouent, nous pouvons supposer que la connectivité réseau a été perdue ou que 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. Configurez votre navigateur pour qu'il fonctionne hors ligne et voyez ce qui se passe…. non, ce n'est pas très excitant.
Déclenchement et liaison
Ce qui est passionnant (ou du moins ce qui m'excite), c'est la méthode par laquelle le statut est relayé via l'application. Je suis tombé sur une méthode largement non discutée d'implémentation d'un système pub / sous en utilisant les méthodes de déclenchement et de liaison de jQuery.
Le code de démonstration est plus obtus qu'il ne devrait l'être. L'objet de détection de réseau publie les événements de «statut» dans le document qui les écoute activement et publie à son tour les événements de «notification» à tous les abonnés (nous en parlerons plus tard). Le raisonnement derrière cela est que dans une application du monde réel, il y aurait probablement plus de logique contrôlant quand et comment les événements de «notification» sont publiés.
$(document).bind("status.networkDetection", function(e, status){
subscribers = $('.subscriber.networkDetection');
subscribers.trigger("notify.networkDetection", [status])
});
En raison de l'approche centrée DOM de jQuery, les événements sont publiés dans (déclenchés sur) les éléments DOM. Cela peut être la fenêtre ou l'objet de document 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 adoptée avec la démo est de créer une approche presque en espace de noms pour définir les abonnés.
Les éléments DOM qui doivent être abonnés sont simplement classés par «abonné» et «détection de réseau». On peut alors publier des événements uniquement sur ces éléments (dont il n'y en a qu'un dans la démo) en déclenchant un événement de notification sur$(“.subscriber.networkDetection”)
Le #notifier
div qui fait partie du .subscriber.networkDetection
groupe d'abonnés a alors une fonction anonyme qui lui est liée, agissant effectivement en tant qu'auditeur.
$('#notifier').bind("notify.networkDetection",function(e, online){
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");
}
};
});
Alors, voilà. Tout est assez verbeux et mon exemple n'est pas du tout passionnant. Cela ne présente pas non plus quelque chose d'intéressant que vous puissiez faire avec ces méthodes, mais si quelqu'un est intéressé à fouiller dans la source, n'hésitez pas. Tout le code est en ligne dans la tête de la page de démonstration