1. define(function(require,exports,module){
  2.  
  3. var Events=function(){
  4. var array = [];
  5. var push = array.push;
  6. var slice = array.slice;
  7. var splice = array.splice;
  8. var Events = {
  9.  
  10. // Bind an event to a `callback` function. Passing `"all"` will bind
  11. // the callback to all events fired.
  12. on: function(name, callback, context) {
  13. if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
  14. this._events || (this._events = {});
  15. var events = this._events[name] || (this._events[name] = []);
  16. events.push({callback: callback, context: context, ctx: context || this});
  17. return this;
  18. },
  19.  
  20. // Bind an event to only be triggered a single time. After the first time
  21. // the callback is invoked, it will be removed.
  22. once: function(name, callback, context) {
  23. if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
  24. var self = this;
  25. var once = _.once(function() {
  26. self.off(name, once);
  27. callback.apply(this, arguments);
  28. });
  29. once._callback = callback;
  30. return this.on(name, once, context);
  31. },
  32.  
  33. // Remove one or many callbacks. If `context` is null, removes all
  34. // callbacks with that function. If `callback` is null, removes all
  35. // callbacks for the event. If `name` is null, removes all bound
  36. // callbacks for all events.
  37. off: function(name, callback, context) {
  38. var retain, ev, events, names, i, l, j, k;
  39. if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
  40. if (!name && !callback && !context) {
  41. this._events = {};
  42. return this;
  43. }
  44.  
  45. names = name ? [name] : _.keys(this._events);
  46. for (i = 0, l = names.length; i < l; i++) {
  47. name = names[i];
  48. if (events = this._events[name]) {
  49. this._events[name] = retain = [];
  50. if (callback || context) {
  51. for (j = 0, k = events.length; j < k; j++) {
  52. ev = events[j];
  53. if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||
  54. (context && context !== ev.context)) {
  55. retain.push(ev);
  56. }
  57. }
  58. }
  59. if (!retain.length) delete this._events[name];
  60. }
  61. }
  62.  
  63. return this;
  64. },
  65.  
  66. // Trigger one or many events, firing all bound callbacks. Callbacks are
  67. // passed the same arguments as `trigger` is, apart from the event name
  68. // (unless you're listening on `"all"`, which will cause your callback to
  69. // receive the true name of the event as the first argument).
  70. trigger: function(name) {
  71. if (!this._events) return this;
  72. var args = slice.call(arguments, 1);
  73. if (!eventsApi(this, 'trigger', name, args)) return this;
  74. var events = this._events[name];
  75. var allEvents = this._events.all;
  76. if (events) triggerEvents(events, args);
  77. if (allEvents) triggerEvents(allEvents, arguments);
  78. return this;
  79. },
  80.  
  81. // Tell this object to stop listening to either specific events ... or
  82. // to every object it's currently listening to.
  83. stopListening: function(obj, name, callback) {
  84. var listeners = this._listeners;
  85. if (!listeners) return this;
  86. var deleteListener = !name && !callback;
  87. if (typeof name === 'object') callback = this;
  88. if (obj) (listeners = {})[obj._listenerId] = obj;
  89. for (var id in listeners) {
  90. listeners[id].off(name, callback, this);
  91. if (deleteListener) delete this._listeners[id];
  92. }
  93. return this;
  94. }
  95.  
  96. };
  97.  
  98. // Regular expression used to split event strings.
  99. var eventSplitter = /\s+/;
  100.  
  101. // Implement fancy features of the Events API such as multiple event
  102. // names `"change blur"` and jQuery-style event maps `{change: action}`
  103. // in terms of the existing API.
  104. var eventsApi = function(obj, action, name, rest) {
  105. if (!name) return true;
  106.  
  107. // Handle event maps.
  108. if (typeof name === 'object') {
  109. for (var key in name) {
  110. obj[action].apply(obj, [key, name[key]].concat(rest));
  111. }
  112. return false;
  113. }
  114.  
  115. // Handle space separated event names.
  116. if (eventSplitter.test(name)) {
  117. var names = name.split(eventSplitter);
  118. for (var i = 0, l = names.length; i < l; i++) {
  119. obj[action].apply(obj, [names[i]].concat(rest));
  120. }
  121. return false;
  122. }
  123.  
  124. return true;
  125. };
  126.  
  127. // A difficult-to-believe, but optimized internal dispatch function for
  128. // triggering events. Tries to keep the usual cases speedy (most internal
  129. // Backbone events have 3 arguments).
  130. var triggerEvents = function(events, args) {
  131. var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
  132. switch (args.length) {
  133. case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
  134. case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
  135. case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
  136. case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
  137. default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
  138. }
  139. };
  140.  
  141. // Aliases for backwards compatibility.
  142. Events.bind = Events.on;
  143. Events.unbind = Events.off;
  144. return Events;
  145. }()
  146.  
  147. module.exports=Events
  148.  
  149. })

javascript的事件触发和接收源码的更多相关文章

  1. 事件机制-Spring 源码系列(4)

    事件机制-Spring 源码系列(4) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostProcess ...

  2. 移动端触摸、点击事件优化(fastclick源码学习)

    移动端触摸.点击事件优化(fastclick源码学习) 最近在做一些微信移动端的页面,在此记录关于移动端触摸和点击事件的学习优化过程,主要内容围绕fastclick展开.fastclick githu ...

  3. SpringBoot内置生命周期事件详解 SpringBoot源码(十)

    SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringBoot事件监听 ...

  4. Spring事件监听机制源码解析

    Spring事件监听器使用 1.Spring事件监听体系包括三个组件:事件.事件监听器,事件广播器. 事件:定义事件类型和事件源,需要继承ApplicationEvent. package com.y ...

  5. QWidget 键盘事件 焦点(QApplication源码)

    在Qt中,键盘事件和QWidget的focus密不可分:一般来说,一个拥有焦点(focus)的QWidget或者grabKeyboard()的QWidget才可以接受键盘事件. 键盘事件派发给谁? 如 ...

  6. SpringBoot事件监听机制源码分析(上) SpringBoot源码(九)

    SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringApplicat ...

  7. 关于JavaScript的事件触发

    突然知道JavaScript底层是怎么实现事件触发的,找到一个博客,功力不够,看的很迷糊,记载这里吧,后面再研究. [探讨]javascript事件机制底层实现原理

  8. Spring事件监听ApplicationListener源码流程分析

    spring的事件机制是基于观察者设计模式的,ApplicationListener#onApplicationEvent(Event)方法,用于对事件的处理 .在容器初始化的时候执行注册到容器中的L ...

  9. RocketMQ之十:RocketMQ消息接收源码

    1. 简介 1.1.接收消息 RebalanceService:均衡消息队列服务,负责通过MQClientInstance分配当前 Consumer 可消费的消息队列( MessageQueue ). ...

随机推荐

  1. 9.TOP 子句--mysql limit

    TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 注释:并非所有的数据库系统都支持 TOP 子句. MySQL 语法 SELECT c ...

  2. 学习PDO啦

    通过查找资料对PDO有了一定的了解,PDO(PHP Data Object )为PHP数据对象,为PHP访问数据库提供了一个轻量级的借口,但PDO本生不能实现访问数据库的任何功能,只能通过数据库的PD ...

  3. Part8-不用内存怎么行_6410内存初始化lesson3

    1.6410地址空间 外设区:从0x70000000-0x7FFFFFFF有256MB 主存储区:从0x00000000-0x6FFFFFFF有1972MB 对于主存储区: 静态存储区可以接我们的NO ...

  4. unbutu下wireshark编译安装(已更新)

    今天下午在ubuntu下进行编译安装wireshark,过程中出了很多错误,但最终安装成功了,这里写下自己的安装步骤和方法,有参考博文的安装编译方法,也有自己的总结和心得. 1 安装编译工具 $sud ...

  5. Selenium家谱

    自动化测试一词也算是整个测试行业里面比较热门的一个词儿,工资高,前景好,有实力,有态度等等,很多企业的管理者也在不断的扩大自己的队伍和职能,这也是导致自动化测试比较流行的原因之一.但是很多企业做自动化 ...

  6. MongoDB整理笔记の增加节点

    MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境 ...

  7. WebApi与MVC Route 问题整理

    1. 为WebAPI添加 Area后,完成了CustomControllerSelector的制定. 跟踪WebAPI底层,整理WebAPI源码后发现几个问题: 1. 使用Area的controlle ...

  8. [.net 多线程]volatile 摘录

    一.volatile 介绍 volatile 关键字指示一个字段可以由多个同时执行的线程修改. 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制. 这样可以确保该字段在任何时 ...

  9. 教你如何选择BI数据可视化工具

    本文来自网易云社区. 关于如何选择BI数据可视化工具,总体而言,主流BI产品在选择的时候要除了需要考虑从数据到展现.从公司内到公司外等各种场景,结合前面朋友的回答,还需要考虑以下几点:1:以后的数据处 ...

  10. 《C#多线程编程实战》2.8 Barrier

    不得不说,C#的同步线程的机制是真的多. 各式各样.几乎各种场景下都有可以使用的同步机制. 今天说的,就是比较有意思了. 等待的机制很简单,单纯的等待. 使用的方法我就等. 等待的东西或者内容则是你自 ...