laya-coreui-es
Version:
laya核心库、ui库es版本,剔除了媒体、TTF等功能。基于 LayaAir-release_2.12.0 修改
146 lines (145 loc) • 5.12 kB
JavaScript
import { Handler } from "../utils/Handler";
export class EventDispatcher {
hasListener(type) {
var listener = this._events && this._events[type];
return !!listener;
}
event(type, data = null) {
if (!this._events || !this._events[type])
return false;
var listeners = this._events[type];
if (listeners.run) {
if (listeners.once)
delete this._events[type];
data != null ? listeners.runWith(data) : listeners.run();
}
else {
for (var i = 0, n = listeners.length; i < n; i++) {
var listener = listeners[i];
if (listener) {
(data != null) ? listener.runWith(data) : listener.run();
}
if (!listener || listener.once) {
listeners.splice(i, 1);
i--;
n--;
}
}
if (listeners.length === 0 && this._events)
delete this._events[type];
}
return true;
}
on(type, caller, listener, args = null) {
return this._createListener(type, caller, listener, args, false);
}
once(type, caller, listener, args = null) {
return this._createListener(type, caller, listener, args, true);
}
_createListener(type, caller, listener, args, once, offBefore = true) {
offBefore && this.off(type, caller, listener, once);
var handler = EventHandler.create(caller || this, listener, args, once);
this._events || (this._events = {});
var events = this._events;
if (!events[type])
events[type] = handler;
else {
if (!events[type].run)
events[type].push(handler);
else
events[type] = [events[type], handler];
}
return this;
}
off(type, caller, listener, onceOnly = false) {
if (!this._events || !this._events[type])
return this;
var listeners = this._events[type];
if (listeners != null) {
if (listeners.run) {
if ((!caller || listeners.caller === caller) && (listener == null || listeners.method === listener) && (!onceOnly || listeners.once)) {
delete this._events[type];
listeners.recover();
}
}
else {
var count = 0;
for (var i = 0, n = listeners.length; i < n; i++) {
var item = listeners[i];
if (!item) {
count++;
continue;
}
if (item && (!caller || item.caller === caller) && (listener == null || item.method === listener) && (!onceOnly || item.once)) {
count++;
listeners[i] = null;
item.recover();
}
}
if (count === n)
delete this._events[type];
}
}
return this;
}
offAll(type = null) {
var events = this._events;
if (!events)
return this;
if (type) {
this._recoverHandlers(events[type]);
delete events[type];
}
else {
for (var name in events) {
this._recoverHandlers(events[name]);
}
this._events = null;
}
return this;
}
offAllCaller(caller) {
if (caller && this._events) {
for (var name in this._events) {
this.off(name, caller, null);
}
}
return this;
}
_recoverHandlers(arr) {
if (!arr)
return;
if (arr.run) {
arr.recover();
}
else {
for (var i = arr.length - 1; i > -1; i--) {
if (arr[i]) {
arr[i].recover();
arr[i] = null;
}
}
}
}
isMouseEvent(type) {
return EventDispatcher.MOUSE_EVENTS[type] || false;
}
}
EventDispatcher.MOUSE_EVENTS = { "rightmousedown": true, "rightmouseup": true, "rightclick": true, "mousedown": true, "mouseup": true, "mousemove": true, "mouseover": true, "mouseout": true, "click": true, "doubleclick": true };
class EventHandler extends Handler {
constructor(caller, method, args, once) {
super(caller, method, args, once);
}
recover() {
if (this._id > 0) {
this._id = 0;
EventHandler._pool.push(this.clear());
}
}
static create(caller, method, args = null, once = true) {
if (EventHandler._pool.length)
return EventHandler._pool.pop().setTo(caller, method, args, once);
return new EventHandler(caller, method, args, once);
}
}
EventHandler._pool = [];