首先介绍下YUI的事件机制,很好理解,因为和浏览器事件机制差不多。看懂下面几个方法就可以了:

publish: 创建自定义事件。第一个参数是事件类型,第二个参数是一个对象,里面可以设置默认动作

on: 监听事件, 在默认动作触发前执行回调。第一个参数是事件类型,第二个参数是回调函数

after: 监听事件,和 on 唯一不同的是在默认动作触发后执行回调

fire: 触发事件,类似于在浏览器里进行一次点击操作。第一个参数是事件类型,第二个参数是传递给回调函数的参数。

remove: 移除事件。第一个参数是事件类型,第二个参数是要移除的回调函数(如果为空,则移除该事件类型下所有的监听事件)

流程出来了,当一个自定义事件触发(fire)的时候,会进行如下处理:

什么是观察者模式?

维基百科的解释是:一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。

有点拗口,简单来讲就是有一个控制中心,这个控制中心管理着很多状态,如有个状态 x。而对象A(观察者)和对象B(观察者)对状态 x 很感兴趣,于是A和B在控制中心提交他们的兴趣,并告诉控制中心,当x发生变化时,及时通知他们。

根据 Javascript Patterns 这本书的介绍,浏览器中的事件机制用的就是观察者模式,所以,对于自定义事件,用观察者模式,是再适合不过了。

贴代码:

var EventCenter = {

  events: [],
  publish: function (type, def) {
    var evt = this.events[type] = {};

    evt.def = typeof def === 'function' ? def : null;
    evt.on = [];
    evt.after = [];
  },
  fire: function (type, options) {
    if(typeof this.events[type] === 'undefined') {
      return false;
    }
    var evt = this.events[type],
      i, len;

    //执行绑定在 on 上面的方法
    for(i = 0, len = evt.on.length; i < len; i++) {
      evt.on[i](options);
    }
    //执行默认方法
    evt.def && evt.def(options);
    //执行绑定在 after 上面的方法
    for(i = 0, len = evt.after.length; i < len; i++) {
      evt.after[i](options);
    }
  },
  on: function (type, fn) {
    if(typeof this.events[type] === 'undefined') {
      return false;
    }
    this.events[type].on.push(fn);
  },
  after: function (type, fn) {
    if(typeof this.events[type] === 'undefined') {
      return false;
    }
    this.events[type].after.push(fn);
  },
  remove: function (type, fn) {
    if(typeof this.events[type] === 'undefined') {
      return false;
    }

    if(typeof fn !== 'function') {
      delete this.events[type];
    } else {
      var evt = this.events[type],
        i, len;

      for(i = 0, len = evt.on.length; i < len; i++) {
        if(evt.on[i] === fn) {
          evt.on.splice(i, 1);
        }
      }
      for(i = 0, len = evt.after.length; i < len; i++) {
        if(evt.after[i] === fn) {
          evt.after.splice(i, 1);
        }
      }
    }
  }
};

简单测试下:

EventCenter.publish('abc', function (options) {
  console.log('default ' + options.name);
});

EventCenter.on('abc', function (options) {
  console.log('before default ' + options.name);
});

EventCenter.after('abc', function (options) {
  console.log('after default ' + options.name);
});

EventCenter.fire('abc', {name: 'abc'});

结果如下:

  

这里面的publish方法的第二个参数直接就是一个默认回调,没有按照YUI的规范来写。这个例子主要是让大家对观察者模式和事件的处理机制有个大概的了解,明白里面是怎么个回事。当然,如果有兴趣,可以试着再往里加一些如阻止事件的默认行为和事件冒泡等功能。

延伸阅读:YUI事件模型:http://yuilibrary.com/yui/docs/event-custom/

     观察者模式:《Javascript Patterns》第七章 Observer

观察者模式模拟YUI事件机制的更多相关文章

  1. 观察者模式之spring事件机制

    ddsspring中的事件机制使用到设计模式中的观察者模式 ,观察者模式有两个概念,1.观察者.被观察者.2.被观察者做出相应得动作,观察者能接收到.不分析设计模式,学习下spring中的事件机制实际 ...

  2. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  3. 【探讨】javascript事件机制底层实现原理

    前言 又到了扯淡时间了,我最近在思考javascript事件机制底层的实现,但是暂时没有勇气去看chrome源码,所以今天我来猜测一把 我们今天来猜一猜,探讨探讨,javascript底层事件机制是如 ...

  4. YII框架的事件机制

    一.什么是事件机制 解释:发生了一件事情,然后某些东西对这件事作出反应. 例子:假设发生了A同学结婚事件,然后B同学给份子钱反应,那么,B是怎么知道(监听)A事件的发生了呢,有两种办法. 扫描式:B不 ...

  5. 深入理解DOM事件机制系列第四篇——事件模拟

    × 目录 [1]引入 [2]模拟机制 [3]自定义事件 前面的话 事件是网页中某个特别的瞬间,经常由用户操作或通过其他浏览器功能来触发.但实际上,也可以使用javascript在任意时刻来触发特定的事 ...

  6. javaScript事件机制深入学习(事件冒泡,事件捕获,事件绑定方式,移除事件方式,阻止浏览器默认行为,事件委托,模拟浏览器事件,自定义事件)

    前言 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软 ...

  7. 【初窥javascript奥秘之事件机制】论“点透”与“鬼点击”

    前言 最近好好的研究了一番移动设备的点击响应速度,期间不断的被自己坑,最后搞得焦头烂额,就是现在可能还有一些问题,但是过程中感觉自己成长不少, 最后居然感觉对javascript事件机制有了更好的认识 ...

  8. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

  9. 我也来说说js的事件机制

    原文链接:http://www.w3cfuns.com/notes/17398/8062de2558ef495ce6cb7679f940ae5c.html 学js,不懂事件机制,基本可以说学了js,就 ...

随机推荐

  1. Robberies(HDU 2955 DP01背包)

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. 查看oracle中的中文所占字节数

    select userenv('language') from dual 显示:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 表示一个汉字占用两个字节. 显示:SIMPLIFIE ...

  3. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

    原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...

  4. Windows搭建Sublime Text 3 + Go开发环境

    1. 安装Sublime Text 3 Sublime Text 3(以下简称ST)的下载与安装我就不说啦,目前还是一个测试版,不过据说比ST2增加了好多新功能,下载地址: http://www.su ...

  5. linux命令行常用快捷键

    方向          <-前               后 ->删除ctrl + d      删除光标所在位置上的字符相当于VIM里x或者dlctrl + h      删除光标所在 ...

  6. First Missing Positive 解答

    Question Given an unsorted integer array, find the first missing positive integer. For example,Given ...

  7. Unique Binary Search Trees 解答

    Question Given n, how many structurally unique BST's (binary search trees) that store values 1...n? ...

  8. python选择排序实现与C选择排序实现

    python代码: #coding=utf-8 if __name__=="__main__": arr=[3,2,1,7,11,4,5,8] print "Before ...

  9. 04747_Java语言程序设计(一)_第2章_运算和语句

    推荐使用f2 public class Aserver { public static void main(String args[]) { float f1 = (float) 12.345; fl ...

  10. fullcalender

    http://blog.csdn.net/francislaw/article/details/7740630 引用 <link rel="stylesheet" href= ...