Hãy xem này:
(in lại từ trang blog đã hết hạn http://jamiethndry.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ dựa trên phiên bản lưu trữ tại http://web.archive.org/web /20130120010146/http://jamiethndry.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Xuất bản / Đăng ký với jQuery
Ngày 17 tháng 6 năm 2008
Với mục đích viết Giao diện người dùng jQuery được tích hợp với chức năng ngoại tuyến của Google Gears, tôi đã chơi với một số mã để thăm dò tình trạng kết nối mạng bằng jQuery.
Đối tượng phát hiện mạng
Tiền đề cơ bản là rất đơn giản. Chúng tôi tạo một phiên bản của một đối tượng phát hiện mạng sẽ thăm dò URL theo định kỳ. Nếu các yêu cầu HTTP này không thành công, chúng tôi có thể cho rằng kết nối mạng đã bị mất hoặc máy chủ đơn giản là không thể truy cập được tại thời điểm hiện tại.
$.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]);
}
});
};
};
Bạn có thể xem bản demo ở đây. Đặt trình duyệt của bạn hoạt động ngoại tuyến và xem điều gì xảy ra. không, nó không thú vị lắm
Kích hoạt và ràng buộc
Điều thú vị mặc dù (hoặc ít nhất là điều khiến tôi hứng thú) là phương thức mà trạng thái được chuyển tiếp qua ứng dụng. Tôi đã vấp phải một phương pháp chủ yếu chưa được thảo luận về việc triển khai hệ thống pub / sub bằng cách sử dụng các phương thức liên kết và kích hoạt của jQuery.
Mã trình diễn khó hiểu hơn mức cần thiết. Đối tượng phát hiện mạng xuất bản các sự kiện 'trạng thái' lên tài liệu chủ động lắng nghe chúng và lần lượt xuất bản các sự kiện 'thông báo' cho tất cả những người đăng ký (nhiều hơn về những sự kiện sau). Lý do đằng sau điều này là trong một ứng dụng trong thế giới thực, có thể sẽ có một số điều khiển logic hơn khi nào và làm thế nào các sự kiện 'thông báo' được công bố.
$(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
*/
});
Do các sự kiện tiếp cận trung tâm DOM của jQuery được xuất bản thành (được kích hoạt) các phần tử DOM. Đây có thể là cửa sổ hoặc đối tượng tài liệu cho các sự kiện chung hoặc bạn có thể tạo đối tượng jQuery bằng bộ chọn. Cách tiếp cận tôi đã thực hiện với bản demo là tạo ra một cách tiếp cận gần như được đặt tên để xác định người đăng ký.
Các phần tử DOM sẽ là người đăng ký được phân loại đơn giản với thuê bao của người dùng trực tuyến và mạng mạngDetection trực tiếp. Sau đó, chúng tôi chỉ có thể xuất bản các sự kiện cho các yếu tố này (trong đó chỉ có một sự kiện trong bản demo) bằng cách kích hoạt một sự kiện thông báo trên$(“.subscriber.networkDetection”)
Các #notifier
div đó là một phần của .subscriber.networkDetection
nhóm các thuê bao sau đó có một chức năng ẩn danh liên kết với nó, hoạt động có hiệu quả như một người biết lắng nghe.
$('#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");
}
};
});
Vì vậy, có bạn đi. Đó là tất cả dài dòng và ví dụ của tôi không thú vị chút nào. Nó cũng không giới thiệu bất cứ điều gì thú vị mà bạn có thể làm với các phương pháp này, nhưng nếu bất kỳ ai cũng muốn tìm hiểu về nguồn này thì cảm thấy thoải mái. Tất cả các mã là nội tuyến trong phần đầu của trang demo