Погляньте на це:
(Передруковано з Минулого сторінки блог http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ на основі архівної версії на http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Опублікувати / Підписатися на jQuery
17 червня 2008 року
З метою написання інтерфейсу jQuery, інтегрованого в офлайн-функціональність Google Gears, я грав з деяким кодом, щоб перевірити стан підключення до мережі за допомогою jQuery.
Об'єкт виявлення мережі
Основна передумова дуже проста. Ми створюємо екземпляр об’єкта виявлення мережі, який буде запитувати URL через регулярні проміжки часу. Якщо ці HTTP-запити не спрацьовують, ми можемо припустити, що мережеве з’єднання втрачено, або сервер просто недоступний у поточний час.
$.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]);
}
});
};
};
Демонстрацію демонстрації можна переглянути тут. Налаштуйте браузер працювати в режимі офлайн і подивіться, що відбувається…. ні, це не дуже захоплююче.
Запустити і зв’язати
Що захоплююче, хоча (або принаймні те, що мене хвилює), це метод, за допомогою якого стан передається через додаток. Я натрапив на багато в чому не обговорюваний метод реалізації паб / підсистеми, використовуючи тригерні та прив'язні методи jQuery.
Демо-код більш тупий, ніж повинен бути. Об'єкт виявлення мережі публікує події "статусу" в документі, який активно їх слухає, і, в свою чергу, публікує події "сповіщення" всім підписникам (докладніше про них пізніше). Причина цього полягає в тому, що в реальному застосуванні, ймовірно, буде ще якась логіка, яка контролює, коли і як публікуються події "сповіщення".
$(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
*/
});
Через централізований підхід DQ jQuery події публікуються (запускаються на) елементах DOM. Це може бути вікно або документ об'єкта для загальних подій або ви можете створити об’єкт jQuery за допомогою селектора. Підхід, який я застосував із демонстрацією, полягає у створенні майже просторового підходу до визначення абонентів.
Елементи DOM, які мають бути абонентами, класифікуються просто з "абонентом" та "мережевим виявленням". Потім ми можемо публікувати події лише для цих елементів (з яких у демонстрації є лише один), ініціюючи подію сповіщення на$(“.subscriber.networkDetection”)
Далі, #notifier
що входить до .subscriber.networkDetection
групи підписників, потім має анонімну функцію, пов'язану з нею, ефективно виступаючи в ролі слухача.
$('#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");
}
};
});
Отже, там ви йдете. Це все досить багатослівно, і мій приклад зовсім не захоплюючий. Він також не демонструє нічого цікавого, що ви могли б зробити з цими методами, але якщо хтось взагалі зацікавлений копати джерело, не соромтеся. Весь код знаходиться в заголовку демо-сторінки