12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- function EventDispatcher () {}
- Object.assign(EventDispatcher.prototype, {
- /**
- * 添加监听器
- * @param type{string} 监听器类型
- * @param listener{function} 方法
- * @param mutexStatus{boolean} 互斥开关
- */
- addEventListener: function (type, listener, mutexStatus = false) {
- if (this._listeners === undefined) this._listeners = {};
- this._mutex = this._mutex || {};
- const mutex = this._mutex;
- var listeners = this._listeners;
- if (listeners[type] === undefined) {
- listeners[type] = [];
- }
- if (listeners[type].indexOf(listener) === -1) {
- // 如果启用功能互斥
- if (mutexStatus) {
- mutex[type] = listener;
- }
- listeners[type].push(listener);
- }
- },
- hasEventListener: function (type, listener) {
- if (this._listeners === undefined) return false;
- var listeners = this._listeners;
- return listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1
- },
- removeEventListener: function (type, listener) {
- if (this._listeners === undefined) return;
- var listeners = this._listeners;
- var listenerArray = listeners[type];
- // 移除指定的功能互斥
- if (this._mutex[type] === listener) {
- this._mutex[type] = null;
- }
- if (listenerArray !== undefined) {
- var index = listenerArray.indexOf(listener);
- if (index !== -1) {
- listenerArray.splice(index, 1);
- }
- }
- },
- /**
- * 派发事件
- * @param event{{type: string, message?: *}}
- */
- dispatchEvent: function (event) {
- if (this._listeners === undefined) return;
- var listeners = this._listeners;
- var listenerArray = listeners[event.type];
- if (listenerArray !== undefined) {
- event.target = this;
- // Make a copy, in case listeners are removed while iterating.
- var array = listenerArray.slice(0);
- if (this._mutex[event.type]){
- const find = array.find(item => item === this._mutex[event.type]);
- find.call(this, event);
- // console.log(' 事件互斥已启动')
- return
- }
- for (var i = 0, l = array.length; i < l; i++) {
- array[i].call(this, event);
- }
- }
- },
- removeAllListener () {
- this._mutex = {};
- for (const key in this._listeners) {
- this._listeners[key] = [];
- }
- }
- });
- export { EventDispatcher };
|