API Docs for: 1.10.1 最后更新日期:2016年03月28日
Google搜索   
Show:

File: events/LEventDispatcher.js

  1. /** @language chinese
  2. * <p>LEventDispatcher 类是可调度事件的所有类的基类。</p>
  3. * @class LEventDispatcher
  4. * @extends LObject
  5. * @constructor
  6. * @since 1.8.0
  7. * @public
  8. */
  9. var LEventDispatcher = (function () {
  10. function LEventDispatcher () {
  11. var s = this;
  12. LExtends(s, LObject, []);
  13. s._eventList = new Array();
  14. }
  15. var p = {
  16. /** @language chinese
  17. * <p>使用 LEventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。可以为特定类型的事件、阶段和优先级在显示列表中的所有节点上注册事件侦听器。</p>
  18. * <p>成功注册一个事件侦听器后,无法通过额外调用 addEventListener() 来更改其优先级。要更改侦听器的优先级,必须首先调用 removeListener()。然后,可以使用新的优先级再次注册该侦听器。</p>
  19. * <p>如果不再需要某个事件侦听器,可调用 removeEventListener() 删除它,否则会产生内存问题。</p>
  20. * @method addEventListener
  21. * @param {String} type 事件的类型。
  22. * @param {Function} listener 处理事件的侦听器函数。
  23. * @public
  24. * @since 1.8.0
  25. */
  26. addEventListener : function (type, listener) {
  27. this._eventList.push({listener : listener, type : type});
  28. },
  29. /** @language chinese
  30. * <p>从 LEventDispatcher 对象中删除侦听器。如果没有向 LEventDispatcher 对象注册任何匹配的侦听器,则对此方法的调用没有任何效果。</p>
  31. * @method removeEventListener
  32. * @param {String} type 事件的类型。
  33. * @param {Function} listener 要删除的侦听器对象。
  34. * @public
  35. * @since 1.8.0
  36. */
  37. removeEventListener : function (type, listener) {
  38. var s = this, i, length;
  39. length = s._eventList.length;
  40. for (i = 0; i < length; i++) {
  41. if (!s._eventList[i]) {
  42. continue;
  43. }
  44. if (type == s._eventList[i].type && (!listener || s._eventList[i].listener == listener)) {
  45. s._eventList.splice(i, 1);
  46. return;
  47. }
  48. }
  49. },
  50. /** @language chinese
  51. * <p>从 LEventDispatcher 对象中删除所有侦听器。</p>
  52. * @method removeAllEventListener
  53. * @public
  54. * @since 1.8.0
  55. */
  56. removeAllEventListener : function () {
  57. this._eventList = [];
  58. },
  59. /** @language chinese
  60. * <p>将事件调度到事件流中。事件目标是对其调用 dispatchEvent() 方法的 LEventDispatcher 对象。</p>
  61. * @method dispatchEvent
  62. * @param {LEvent | String} event 调度到事件流中的 Event 对象。如果正在重新调度事件,则会自动创建此事件的一个克隆。在调度了事件后,其 target 属性将无法更改,因此您必须创建此事件的一个新副本以能够重新调度。
  63. * @return {Boolean} 如果成功调度了事件,则值为 true。
  64. * @example
  65. * function MyEventObject(){
  66. * var self = this;
  67. * LExtends(self,LSprite,[]);
  68. * self.graphics.drawRect(1,"#000000",[0,0,100,100],true,"#000000");
  69. * self.graphics.drawRect(1,"#FF0000",[100,0,100,100],true,"#FF0000");
  70. * self.addEventListener(LMouseEvent.MOUSE_UP,self.onclick);
  71. * self.addEventListener(MyEventObject.CLICK_LEFT,function(event){
  72. * trace("dispatchEvent");
  73. * });
  74. * self.addEventListener(MyEventObject.CLICK_RIGHT,function(event){
  75. * trace("dispatchEvent event.name = " + event.name);
  76. * });
  77. * }
  78. * MyEventObject.CLICK_LEFT = "click_left";
  79. * MyEventObject.CLICK_RIGHT = "click_right";
  80. * MyEventObject.prototype.onclick = function(event){
  81. * var self = event.clickTarget;
  82. * if(event.selfX < 100){
  83. * self.dispatchEvent(MyEventObject.CLICK_LEFT);
  84. * }else{
  85. * var event = new LEvent(MyEventObject.CLICK_RIGHT);
  86. * event.name = "LEvent Test";
  87. * self.dispatchEvent(event);
  88. * }
  89. * }
  90. * @examplelink <p><a href="../../../api/LEventDispatcher/dispatchEvent.html" target="_blank">测试链接</a></p>
  91. * @public
  92. * @since 1.8.0
  93. */
  94. dispatchEvent : function (event) {
  95. var s = this, i, length = s._eventList.length, ctype = (typeof event == "string") ? event : event.eventType;
  96. for (i = 0; i < length; i++) {
  97. if (!s._eventList[i]) {
  98. continue;
  99. }
  100. if (ctype == s._eventList[i].type) {
  101. if (typeof event == "string") {
  102. s.currentTarget = s.target = s;
  103. s.eventType = s.event_type = ctype;
  104. s._eventList[i].listener(s);
  105. delete s.currentTarget;
  106. delete s.target;
  107. delete s.eventType;
  108. }else{
  109. if (!event.target) {
  110. event.target = s;
  111. }
  112. if (!event.currentTarget) {
  113. event.currentTarget = event.target;
  114. }
  115. event._ll_preventDefault = false;
  116. s._eventList[i].listener(event);
  117. if (event._ll_preventDefault) {
  118. return false;
  119. }
  120. }
  121. return true;
  122. }
  123. }
  124. return false;
  125. },
  126. /** @language chinese
  127. * <p>检查 LEventDispatcher 对象是否为特定事件类型注册了任何侦听器。这样,您就可以确定 LEventDispatcher 对象在事件流层次结构中的哪个位置改变了对事件类型的处理。</p>
  128. * @method hasEventListener
  129. * @param {String} type 事件的类型。
  130. * @return {Boolean} 如果指定类型的侦听器已注册,则值为 true;否则,值为 false。
  131. * @public
  132. * @since 1.8.0
  133. */
  134. hasEventListener : function (type, listener) {
  135. var s = this, i, length = s._eventList.length;
  136. for (i = 0; i < length; i++) {
  137. if (!s._eventList[i]) {
  138. continue;
  139. }
  140. if (type == s._eventList[i].type) {
  141. if (typeof listener == UNDEFINED || listener == s._eventList[i].listener) {
  142. return true;
  143. }
  144. }
  145. }
  146. return false;
  147. }
  148. };
  149. for (var k in p) {
  150. LEventDispatcher.prototype[k] = p[k];
  151. }
  152. return LEventDispatcher;
  153. })();