1
0
mirror of synced 2025-12-11 00:48:21 +08:00

Dev: Change event listener implementation

This commit is contained in:
surunzi
2016-05-20 23:45:55 +08:00
parent 1c51b6b691
commit 76f8c0ddd3

View File

@@ -18,7 +18,6 @@ export default class Elements extends Tool
this._rmDefComputedStyle = true;
this._highlightElement = false;
this._selectElement = false;
this._events = {};
}
init($el, parent)
{
@@ -50,19 +49,15 @@ export default class Elements extends Tool
var origAddEvent = this._origAddEvent = winEventProto.addEventListener,
origRmEvent = this._origRmEvent = winEventProto.removeEventListener;
var self = this;
winEventProto.addEventListener = function (type, listener, useCapture)
{
var id = this.erudaEventId = this.erudaEventId || util.uniqId('event');
self._addEvent(id, type, listener, useCapture);
addEvent(this, type, listener, useCapture);
origAddEvent.apply(this, arguments);
};
winEventProto.removeEventListener = function (type, listener, useCapture)
{
var id = this.erudaEventId;
if (id) self._rmEvent(id, type, listener, useCapture);
rmEvent(this, type, listener, useCapture);
origRmEvent.apply(this, arguments);
};
}
@@ -79,41 +74,6 @@ export default class Elements extends Tool
this.restoreEventTarget();
}
_addEvent(id, type, listener, useCapture = false)
{
if (!util.isFn(listener) && !util.isBool(useCapture)) return;
var events = this._events;
events[id] = events[id] || {};
events[id][type] = events[id][type] || [];
events[id][type].push({
listener: listener,
listenerStr: listener.toString(),
useCapture: useCapture
});
}
_rmEvent(id, type, listener, useCapture = false)
{
if (!util.isFn(listener) && !util.isBool(useCapture)) return;
var events = this._events;
if (!(events[id] && events[id][type])) return;
var listeners = events[id][type];
for (let i = 0, len = listeners.length; i < len; i++)
{
if (listeners[i].listener === listener)
{
listeners.splice(i, 1);
break;
}
}
if (listener.length === 0) delete events[id][type];
}
_back()
{
if (this._curEl === this._htmlEl) return;
@@ -241,12 +201,8 @@ export default class Elements extends Tool
ret.attributes = formatAttr(attributes);
ret.name = formatElName({tagName, id, className, attributes});
var eventId = el.erudaEventId;
if (eventId)
{
var listeners = this._events[eventId];
if (util.keys(listeners).length !== 0) ret.listeners = listeners;
}
var events = el.erudaEvents;
if (events && util.keys(events).length !== 0) ret.listeners = events;
if (needNoStyle(tagName)) return ret;
@@ -285,7 +241,7 @@ export default class Elements extends Tool
var settings = this._parent.get('settings');
settings.text('Elements')
.add(cfg, 'overrideEventTarget', 'Show Event Listeners')
.add(cfg, 'overrideEventTarget', 'Catch Event Listeners')
.separator();
}
}
@@ -387,3 +343,40 @@ function rmDefComputedStyle(computedStyle)
var NO_STYLE_TAG = ['script', 'style', 'meta', 'title', 'link', 'head'];
var needNoStyle = tagName => NO_STYLE_TAG.indexOf(tagName.toLowerCase()) > -1;
function addEvent(el, type, listener, useCapture = false)
{
if (!util.isFn(listener) || !util.isBool(useCapture)) return;
var events = el.erudaEvents = el.erudaEvents || {};
events[type] = events[type] || [];
events[type].push({
listener: listener,
listenerStr: listener.toString(),
useCapture: useCapture
});
}
function rmEvent(el, type, listener, useCapture = false)
{
if (!util.isFn(listener) || !util.isBool(useCapture)) return;
var events = el.erudaEvents;
if (!(events && events[type])) return;
var listeners = events[type];
for (let i = 0, len = listeners.length; i < len; i++)
{
if (listeners[i].listener === listener)
{
listeners.splice(i, 1);
break;
}
}
if (listener.length === 0) delete events[type];
}