jQuery的观察者模式详解


Posted in Javascript onDecember 22, 2014

在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>

jQuery的观察者模式详解 

如果用一个全局变量来接收异步获取的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>

jQuery的观察者模式详解

这次,我们得到的结果却是undefined,这是为什么?
--因为,当$.getJSON方法还在获取数据的时候,就已经执行console.log(data),而此时data还没有数据。

如何解决这个问题呢?
--如果在$.getJSON方法之外先定义好需要执行的方法,然后在$.getJSON方法的回调函数里真正触发这个方法,不就解决了吗?

    <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>

jQuery的观察者模式详解

以上,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>

jQuery的观察者模式详解

以上,定义了全局的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的观察者模式详解

总结:jQuery的观察者模式,实际上是让on方法绑定的自定义事件先不执行,直到使用trigger方法来触发事件。使用jQuery的观察者模式的好处是:一次发布,多次订阅。

Javascript 相关文章推荐
javaScript parseInt字符转化为数字函数使用小结
Nov 05 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
Nov 19 Javascript
window.location.href的用法(动态输出跳转)
Aug 09 Javascript
javascript简单实现图片预加载
Dec 03 Javascript
分享一则javascript 调试技巧
Jan 02 Javascript
AngularJS 实现按需异步加载实例代码
Oct 18 Javascript
客户端验证用户名和密码的方法详解
Jun 16 Javascript
全面了解JavaScript的数据类型转换
Jul 01 Javascript
js验证真实姓名与身份证号,手机号的简单实例
Jul 18 Javascript
详解Jquery的事件操作和文档操作
Dec 19 Javascript
如何用webpack4带你实现一个vue的打包的项目
Jun 20 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
Oct 11 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 #Javascript
sails框架的学习指南
Dec 22 #Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 #Javascript
javascript动态创建及删除元素的方法
Dec 22 #Javascript
了不起的node.js读书笔记之例程分析
Dec 22 #Javascript
了不起的node.js读书笔记之node的学习总结
Dec 22 #Javascript
了不起的node.js读书笔记之node.js中的特性
Dec 22 #Javascript
You might like
用php实现选择排序的解决方法
2013/05/04 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
document.compatMode介绍
2009/05/21 Javascript
在html页面上拖放移动标签
2010/01/08 Javascript
js 小数取整的函数
2010/05/10 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
python创建列表并给列表赋初始值的方法
2015/07/28 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
Python FFT合成波形的实例
2019/12/04 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
Flask处理Web表单的实现方法
2021/01/31 Python
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
跟单文员的岗位职责
2013/11/14 职场文书
活动倡议书范文
2014/05/13 职场文书
校庆标语集锦
2014/06/25 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
英语复习计划
2015/01/19 职场文书
新员工入职欢迎词
2015/01/23 职场文书
工作犯错保证书
2015/05/11 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书