jQuery的觀察者模式詳解
在jQuery中,on方法可以為元素綁定事件,trigger方法可以手動(dòng)觸發(fā)事件,圍繞這2個(gè)方法,我們來體驗(yàn)jQuery中的觀察者模式(Observer Pattern)。
■ on方法綁定內(nèi)置事件,自然觸發(fā)
比如,我們給頁(yè)面的body元素綁定一個(gè)click事件,這樣寫。
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function() {
$('body').on('click', function () {
console.log('被點(diǎn)擊了~~');
});
});
</script>
</head>
<body>
<h1>hello</h1>
</body>
以上,我們只有點(diǎn)擊body,才能觸發(fā)click事件。也就是說,當(dāng)給頁(yè)面元素綁定內(nèi)置事件后,事件的觸發(fā)是在內(nèi)置事件發(fā)生的那刻。
■ on方法綁定內(nèi)置事件,手動(dòng)觸發(fā)
使用trigger方法,也可以手動(dòng)觸發(fā)元素綁定的內(nèi)置事件。
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function() {
$('body').on('click', function () {
console.log('被點(diǎn)擊了~~');
});
$('body').trigger('click');
});
</script>
以上,無(wú)需點(diǎn)擊body,在頁(yè)面加載完畢,body自動(dòng)觸發(fā)了click事件。
■ on方法綁定自定義事件,手動(dòng)觸發(fā)
我們知道,click是jquery內(nèi)置的事件,那么,是否可以自定義事件,并手動(dòng)觸發(fā)呢?
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function() {
$('body').on('someclick', function () {
console.log('被點(diǎn)擊了~~');
});
$('body').trigger('someclick');
});
</script>
以上,我們自定義了一個(gè)someclick事件,得到的結(jié)果和上面一樣。
于是,我們發(fā)現(xiàn):我們可以為元素綁定自定義事件,并且用trigger方法觸發(fā)該事件。
當(dāng)然,自定義事件的名稱可以按照"命名空間.自定義事件名稱"的形式來寫,比如app.someclick,這在大型項(xiàng)目中尤其有用,這樣可以有效避免自定義事件名稱沖突。
如果從"發(fā)布訂閱"這個(gè)角度來看,on方法相當(dāng)于訂閱者、觀察者,trigger方法相當(dāng)于發(fā)布者。
■ 從"異步獲取json數(shù)據(jù)"來體驗(yàn)jQuery觀察者模式
在根目錄下,有一個(gè)data.json的文件。
{
"one" : "Hello",
"two" : "World"
}
現(xiàn)在,通過異步的方式來獲取json數(shù)據(jù)。
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function () {
$.getJSON('data.json', function(data) {
console.log(data);
});
});
</script>
如果用一個(gè)全局變量來接收異步獲取的json數(shù)據(jù)。
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function () {
var data;
$.getJSON('data.json', function(results) {
data = results;
});
console.log(data);
});
</script>

這次,我們得到的結(jié)果卻是undefined,這是為什么?
--因?yàn)?,?dāng)$.getJSON方法還在獲取數(shù)據(jù)的時(shí)候,就已經(jīng)執(zhí)行console.log(data),而此時(shí)data還沒有數(shù)據(jù)。
如何解決這個(gè)問題呢?
--如果在$.getJSON方法之外先定義好需要執(zhí)行的方法,然后在$.getJSON方法的回調(diào)函數(shù)里真正觸發(fā)這個(gè)方法,不就解決了嗎?
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function () {
$.getJSON('data.json', function(results) {
$(document).trigger('app.myevent', results); //相當(dāng)于發(fā)布
});
$(document).on('app.myevent', function(e, results) { //相當(dāng)于訂閱
console.log(results);
});
});
</script>

以上,on方法就像一個(gè)訂閱者,它訂閱了自定義事件app.myevent;而trigger方法就像一個(gè)發(fā)布者,它發(fā)布事件和參數(shù)后,才真正讓訂閱者方法得以執(zhí)行。
■ jQuery觀察者模式的擴(kuò)展方法
為此,我們還可以為jQuery觀察者模式專門寫一個(gè)擴(kuò)展方法。
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function () {
$.getJSON('data.json', function (results) {
$.publish('app.myevent', results);
});
$.subscribe('app.myevent', function(e, results) {
console.log(results);
});
});
(function($) {
var o = $({});//自定義事件對(duì)象
$.each({
trigger: 'publish',
on: 'subscribe',
off: 'unsubscribe'
}, function(key, val) {
jQuery[val] = function() {
o[key].apply(o, arguments);
};
});
})(jQuery);
</script>

以上,定義了全局的publish和subscribe方法,我們?cè)谌魏螘r(shí)候都可以調(diào)用。
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function () {
$.getJSON('data.json', function (results) {
$.publish('app.myevent', results);
});
$.subscribe('app.myevent', function(e, results) {
$('body').html(
results.one
);
});
});

總結(jié):jQuery的觀察者模式,實(shí)際上是讓on方法綁定的自定義事件先不執(zhí)行,直到使用trigger方法來觸發(fā)事件。使用jQuery的觀察者模式的好處是:一次發(fā)布,多次訂閱。
相關(guān)文章
jQuery實(shí)現(xiàn)切換頁(yè)面過渡動(dòng)畫效果
這是一款效果非常酷的jQuery和CSS3通過AJAX調(diào)用切換頁(yè)面過渡動(dòng)畫特效插件。該頁(yè)面切換特效使用AJAX來動(dòng)態(tài)加載鏈接內(nèi)容,在頁(yè)面加載的時(shí)候,使用CSS3來制作非??岬捻?yè)面過渡動(dòng)畫效果。插件中使用pushState方法來管理瀏覽器的瀏覽歷史,需要的朋友可以參考下2015-10-10
jQuery實(shí)現(xiàn)動(dòng)態(tài)給table賦值的方法示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)動(dòng)態(tài)給table賦值的方法,結(jié)合具體實(shí)例形式分析了jQuery動(dòng)態(tài)操作table表格節(jié)點(diǎn)的相關(guān)技巧,需要的朋友可以參考下2017-07-07
仿當(dāng)當(dāng)網(wǎng)淘寶網(wǎng)等主流電子商務(wù)網(wǎng)站商品分類導(dǎo)航菜單
本文實(shí)現(xiàn)了一個(gè)分類導(dǎo)航的菜單,和大多數(shù)流行的電子商務(wù)網(wǎng)站類似,詳細(xì)的實(shí)現(xiàn)可以直接查看源代碼.所有的代碼都在一個(gè)sidebar.html文件中2013-09-09
基于jquery實(shí)現(xiàn)人物頭像跟隨鼠標(biāo)轉(zhuǎn)動(dòng)
一款非常乖巧的人物頭像跟隨鼠標(biāo)轉(zhuǎn)動(dòng)效果,在瀏覽器屏幕內(nèi),人物臉龐始終面向鼠標(biāo)轉(zhuǎn)動(dòng),本篇文章給大家介紹基于jquery實(shí)現(xiàn)人物頭像跟隨鼠標(biāo)轉(zhuǎn)動(dòng),有需要的朋友可以參考下2015-08-08
ajax與json 獲取數(shù)據(jù)并在前臺(tái)使用簡(jiǎn)單實(shí)例
這篇文章主要介紹了ajax與json 獲取數(shù)據(jù)并在前臺(tái)使用簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-01-01
jQuery滾動(dòng)插件scrollable.js用法分析
這篇文章主要介紹了jQuery滾動(dòng)插件scrollable.js用法,簡(jiǎn)單分析了scrollable.js的功能、方法及相關(guān)使用技巧,需要的朋友可以參考下2017-05-05
淺談window.onbeforeunload() 事件調(diào)用ajax
下面小編就為大家?guī)硪黄獪\談window.onbeforeunload() 事件調(diào)用ajax。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06
jQuery+CSS3實(shí)現(xiàn)仿花瓣網(wǎng)固定頂部位置帶懸浮效果的導(dǎo)航菜單
這篇文章主要介紹了jQuery+CSS3實(shí)現(xiàn)仿花瓣網(wǎng)固定頂部位置帶懸浮效果的導(dǎo)航菜單,可實(shí)現(xiàn)頁(yè)面向下滑動(dòng)后導(dǎo)航欄橫向懸浮并固定在頂部的功能,涉及jQuery事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)修改相關(guān)操作技巧,需要的朋友可以參考下2016-09-09
關(guān)于echarts在節(jié)點(diǎn)顯示動(dòng)態(tài)數(shù)據(jù)及添加提示文本所遇到的問題
這篇文章主要介紹了關(guān)于echarts在節(jié)點(diǎn)顯示動(dòng)態(tài)數(shù)據(jù)及添加提示文本所遇到的問題,需要的朋友可以參考下2018-04-04

