在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern)。
■ on方法绑定内置事件,自然触发
比如,我们给页面的body元素绑定一个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('被点击了~~'); }); }); </script> </head> <body> <h1>hello</h1> </body>
以上,我们只有点击body,才能触发click事件。也就是说,当给页面元素绑定内置事件后,事件的触发是在内置事件发生的那刻。
■ on方法绑定内置事件,手动触发
使用trigger方法,也可以手动触发元素绑定的内置事件。
<script src="Scripts/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function() {
$('body').on('click', function () {
console.log('被点击了~~');
});
$('body').trigger('click');
});
</script>
以上,无需点击body,在页面加载完毕,body自动触发了click事件。
■ on方法绑定自定义事件,手动触发
我们知道,click是jquery内置的事件,那么,是否可以自定义事件,并手动触发呢?
<script src="Scripts/jquery-2.1.1.min.js"></script> <script type="text/javascript"> $(function() { $('body').on('someclick', function () { console.log('被点击了~~'); }); $('body').trigger('someclick'); }); </script>
以上,我们自定义了一个someclick事件,得到的结果和上面一样。
于是,我们发现:我们可以为元素绑定自定义事件,并且用trigger方法触发该事件。
当然,自定义事件的名称可以按照"命名空间.自定义事件名称"的形式来写,比如app.someclick,这在大型项目中尤其有用,这样可以有效避免自定义事件名称冲突。
如果从"发布订阅"这个角度来看,on方法相当于订阅者、观察者,trigger方法相当于发布者。
■ 从"异步获取json数据"来体验jQuery观察者模式
在根目录下,有一个data.json的文件。
{
"one" : "Hello",
"two" : "World"
}
现在,通过异步的方式来获取json数据。
<script src="Scripts/jquery-2.1.1.min.js"></script> <script type="text/javascript"> $(function () { $.getJSON('data.json', function(data) { console.log(data); }); }); </script>
如果用一个全局变量来接收异步获取的json数据。
<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>
这次,我们得到的结果却是undefined,这是为什么?
--因为,当$.getJSON方法还在获取数据的时候,就已经执行console.log(data),而此时data还没有数据。
如何解决这个问题呢?
--如果在$.getJSON方法之外先定义好需要执行的方法,然后在$.getJSON方法的回调html" target="_blank">函数里真正触发这个方法,不就解决了吗?
<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); //相当于发布 }); $(document).on('app.myevent', function(e, results) { //相当于订阅 console.log(results); }); }); </script>
以上,on方法就像一个订阅者,它订阅了自定义事件app.myevent;而trigger方法就像一个发布者,它发布事件和参数后,才真正让订阅者方法得以执行。
■ jQuery观察者模式的扩展方法
为此,我们还可以为jQuery观察者模式专门写一个扩展方法。
<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 = $({});//自定义事件对象 $.each({ trigger: 'publish', on: 'subscribe', off: 'unsubscribe' }, function(key, val) { jQuery[val] = function() { o[key].apply(o, arguments); }; }); })(jQuery); </script>
以上,定义了全局的publish和subscribe方法,我们在任何时候都可以调用。
<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 ); }); });
总结:jQuery的观察者模式,实际上是让on方法绑定的自定义事件先不执行,直到使用trigger方法来触发事件。使用jQuery的观察者模式的好处是:一次发布,多次订阅。
主要内容:介绍,实现,Subject.java,Observer.java,BinaryObserver.java,OctalObserver.java,HexaObserver.java,ObserverPatternDemo.java当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知
观察者模式 亦称: 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象: 顾客和 商店 。 顾客对某个特定品牌的产品非常感兴趣 (例如最新型号的 iPhone 手机), 而该产品很快将会在商店里出售。 顾客
一、定义 观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式。 好处: (1)可广泛应用于异步编程中,是一种替代传递回调函数的方案。 (2)可取代对象之间硬编码的通知机制,一个对象不用再显示地调用另外一个对象的某个接口。两对象轻松解耦。 二、DOM事件–观察者
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)
观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 定义一个目标构造函数,并实现绑定、解绑和触发等方法: function Subject() { this.events = {}; this.count = 0; } Subj
问题 当一个事件发生时你不得不向一些对象发布公告。 解决方案 使用观察者模式(Observer Pattern)。 class PostOffice constructor: () -> @subscribers = [] notifyNewItemReleased: (item) -> subscriber.callback(item) for s