Lihatlah ini:
(dicetak ulang dari halaman blog yang sudah kadaluwarsa http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ berdasarkan versi yang diarsipkan di http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Publikasikan / Berlangganan Dengan jQuery
17 Juni 2008
Dengan maksud untuk menulis UI jQuery yang terintegrasi dengan fungsionalitas offline Google Gears, saya telah mempermainkan beberapa kode untuk memilih status koneksi jaringan menggunakan jQuery.
Objek Deteksi Jaringan
Premis dasarnya sangat sederhana. Kami membuat instance objek deteksi jaringan yang akan melakukan polling URL secara berkala. Jika permintaan HTTP ini gagal, kita dapat mengasumsikan bahwa konektivitas jaringan telah hilang, atau server tidak dapat dijangkau pada saat ini.
$.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]);
}
});
};
};
Anda dapat melihat demo di sini. Atur browser Anda untuk bekerja offline dan lihat apa yang terjadi .... tidak, itu tidak terlalu menarik.
Pemicu dan Bind
Apa yang mengasyikkan (atau paling tidak apa yang mengasyikkan bagi saya) adalah metode yang digunakan untuk menyampaikan status melalui aplikasi. Saya telah menemukan metode yang sebagian besar tidak dibahas dalam mengimplementasikan sistem pub / sub menggunakan metode pemicu dan pengikatan jQuery.
Kode demo lebih tumpul daripada yang seharusnya. Objek deteksi jaringan menerbitkan acara 'status' ke dokumen yang secara aktif mendengarkannya dan kemudian menerbitkan acara 'beri tahu' ke semua pelanggan (lebih lanjut tentang hal itu nanti). Alasan di balik ini adalah bahwa dalam aplikasi dunia nyata mungkin akan ada beberapa logika yang mengontrol kapan dan bagaimana acara 'notifikasi' dipublikasikan.
$(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
*/
});
Karena peristiwa pendekatan sentris DOM jQuery dipublikasikan ke (dipicu pada) elemen DOM. Ini bisa menjadi jendela atau objek dokumen untuk acara umum atau Anda bisa membuat objek jQuery menggunakan pemilih. Pendekatan yang saya ambil dengan demo adalah membuat pendekatan yang hampir sama dengan penempatan nama untuk mendefinisikan pelanggan.
Elemen DOM yang akan menjadi pelanggan digolongkan hanya dengan "pelanggan" dan "networkDetection". Kami kemudian dapat mempublikasikan acara hanya untuk elemen-elemen ini (yang hanya ada satu di demo) dengan memicu pemberitahuan acara$(“.subscriber.networkDetection”)
The #notifier
div yang merupakan bagian dari .subscriber.networkDetection
kelompok pelanggan kemudian memiliki fungsi anonim terikat untuk itu, secara efektif bertindak sebagai pendengar.
$('#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");
}
};
});
Jadi, begitulah. Semuanya sangat verbose dan contoh saya sama sekali tidak menarik. Ini juga tidak menampilkan hal menarik yang dapat Anda lakukan dengan metode ini, tetapi jika ada yang tertarik untuk menggali sumbernya, silakan. Semua kode sebaris di bagian atas halaman demo