首先介绍下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. ipad安装自制ipa

    自己用XCode写了个小程序,想打包成ipa安装在真机上,网上查了查: 1.将工程的编译版本设置为release(在edit scheme里): 2.build for Archiving(Produ ...

  2. Spring Boot 配置优先级顺序

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  3. css案例学习之div a实现立体菜单

    效果 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  4. html5视频小站

    本文目的 练习HTML5 学习css3新特性 学习和熟悉移动html基础开发,如触摸知识 网站特点 界面设计仿360影视移动网站 支持主流现代浏览器(注:IE9,chrome,firefox.safa ...

  5. 【转】android camera(四):camera 驱动 GT2005

    关键词:android  camera CMM 模组 camera参数  GT2005 摄像头常见问题 平台信息: 内核:linux系统:android 平台:S5PV310(samsung exyn ...

  6. 所闻所获6:meditashayne项目总结

    项目源码下载地址: https://github.com/ShayneYeorg/Meditashayne 1.首先一开始设计这个App的时候,我就希望它能比系统自带的备忘录更方便:比如备忘录需要手动 ...

  7. “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛暨河南高校邀请赛-正式赛(总结)

    这次轻院校赛,我们去了五个队,怀着打酱油的心态早早爬起来坐上校车出发了,由于昨晚室友打游戏,以及看视频大笑...没睡好,快1点才睡着,感觉特别困,车上没地方,睡不着,就在车上闭目养神,由于在新校区,不 ...

  8. TRIZ系列-创新原理-32-改变颜色原理

    改变颜色原理的详细描写叙述例如以下:1)改变物体或其环境的颜色:2)改变物体或其环境的透明度:3)对于难以看到的物体或过程.使用颜色加入剂来观測.4)假设已经使用了这样的加入剂,那么使用发光跟踪或原子 ...

  9. poj 3894 System Engineer (二分图最大匹配--匈牙利算法)

    System Engineer Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 507   Accepted: 217 Des ...

  10. react-native 布局基础

    宽度单位和像素密度 react的宽度不支持百分比,设置宽度时不需要带单位 {width: 10}, 那么10代表的具体宽度是多少呢? 不知道是官网文档不全还是我眼瞎,反正是没找到,那做一个实验自己找吧 ...