ดูที่นี้:
(พิมพ์ซ้ำจากหน้าบล็อกที่หมดอายุ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 มิถุนายน 2551
ด้วยมุมมองในการเขียน jQuery UI ที่รวมเข้ากับฟังก์ชั่นออฟไลน์ของ 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]);
}
});
};
};
คุณสามารถดูตัวอย่างได้ที่นี่ ตั้งค่าเบราว์เซอร์ของคุณให้ทำงานแบบออฟไลน์และดูว่าเกิดอะไรขึ้น…. ไม่มันไม่น่าตื่นเต้นมาก
ทริกเกอร์และการผูก
สิ่งที่น่าตื่นเต้น (หรืออย่างน้อยสิ่งที่ทำให้ฉันตื่นเต้น) เป็นวิธีการที่สถานะได้รับการถ่ายทอดผ่านแอปพลิเคชัน ฉันสะดุดกับวิธีการที่ไม่ได้กล่าวถึงมากในการนำระบบ pub / sub มาใช้โดยใช้วิธีการทริกเกอร์และการเชื่อมของ 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
*/
});
เนื่องจากมีการเผยแพร่กิจกรรมวิธีการศูนย์กลาง DOM ของ jQuery ให้กับองค์ประกอบ DOM (เรียกใช้) นี่อาจเป็นหน้าต่างหรือวัตถุเอกสารสำหรับเหตุการณ์ทั่วไปหรือคุณสามารถสร้างวัตถุ jQuery โดยใช้ตัวเลือก วิธีที่ฉันใช้กับการสาธิตคือการสร้างวิธีการกำหนดชื่อแบบเกือบเพื่อกำหนดสมาชิก
องค์ประกอบ DOM ที่จะเป็นสมาชิกจะถูกจัดประเภทอย่างง่าย ๆ ด้วย "สมาชิก" และ "networkDetection" จากนั้นเราสามารถเผยแพร่กิจกรรมไปยังองค์ประกอบเหล่านี้เท่านั้น (ซึ่งมีเพียงหนึ่งเหตุการณ์ในการสาธิต) โดยการเปิดใช้งานกิจกรรมการแจ้งเตือน$(“.subscriber.networkDetection”)
#notifier
div ซึ่งเป็นส่วนหนึ่งของ.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");
}
};
});
ดังนั้นคุณไป มันเป็นสิ่งที่สวยงามและตัวอย่างของฉันไม่ได้น่าตื่นเต้นเลย มันยังไม่แสดงสิ่งที่น่าสนใจที่คุณสามารถทำได้ด้วยวิธีการเหล่านี้ แต่ถ้าใครที่สนใจที่จะขุดผ่านแหล่งที่มารู้สึกฟรี รหัสทั้งหมดเป็นแบบอินไลน์ในส่วนหัวของหน้าตัวอย่าง