You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.0 KiB
140 lines
4.0 KiB
2 years ago
|
var Class = require('./Class');
|
||
|
var contain = require('./contain');
|
||
|
function retTrue() {
|
||
|
return true;
|
||
|
}
|
||
|
function retFalse() {
|
||
|
return false;
|
||
|
}
|
||
|
function trigger(e) {
|
||
|
var handlers = this.events[e.type];
|
||
|
var handler;
|
||
|
var handlerQueue = formatHandlers.call(this, e, handlers);
|
||
|
e = new exports.Event(e);
|
||
|
var i = 0,
|
||
|
j,
|
||
|
matched,
|
||
|
ret;
|
||
|
while ((matched = handlerQueue[i++]) && !e.isPropagationStopped()) {
|
||
|
e.curTarget = matched.el;
|
||
|
j = 0;
|
||
|
while (
|
||
|
(handler = matched.handlers[j++]) &&
|
||
|
!e.isImmediatePropagationStopped()
|
||
|
) {
|
||
|
ret = handler.handler.apply(matched.el, [e]);
|
||
|
if (ret === false) {
|
||
|
e.preventDefault();
|
||
|
e.stopPropagation();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
function formatHandlers(e, handlers) {
|
||
|
var current = e.target;
|
||
|
var ret = [];
|
||
|
var delegateCount = handlers.delegateCount;
|
||
|
var selector;
|
||
|
var matches;
|
||
|
var handler;
|
||
|
var i;
|
||
|
if (current.nodeType) {
|
||
|
for (; current !== this; current = current.parentNode || this) {
|
||
|
matches = [];
|
||
|
for (i = 0; i < delegateCount; i++) {
|
||
|
handler = handlers[i];
|
||
|
selector = handler.selector + ' ';
|
||
|
if (matches[selector] === undefined) {
|
||
|
matches[selector] = contain(
|
||
|
this.querySelectorAll(selector),
|
||
|
current
|
||
|
);
|
||
|
}
|
||
|
if (matches[selector]) matches.push(handler);
|
||
|
}
|
||
|
if (matches.length)
|
||
|
ret.push({
|
||
|
el: current,
|
||
|
handlers: matches
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
if (delegateCount < handlers.length) {
|
||
|
ret.push({
|
||
|
el: this,
|
||
|
handlers: handlers.slice(delegateCount)
|
||
|
});
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
exports = {
|
||
|
add: function(el, type, selector, fn) {
|
||
|
var handler = {
|
||
|
selector: selector,
|
||
|
handler: fn
|
||
|
};
|
||
|
var handlers;
|
||
|
if (!el.events) el.events = {};
|
||
|
if (!(handlers = el.events[type])) {
|
||
|
handlers = el.events[type] = [];
|
||
|
handlers.delegateCount = 0;
|
||
|
el.addEventListener(
|
||
|
type,
|
||
|
function() {
|
||
|
trigger.apply(el, arguments);
|
||
|
},
|
||
|
false
|
||
|
);
|
||
|
}
|
||
|
selector
|
||
|
? handlers.splice(handlers.delegateCount++, 0, handler)
|
||
|
: handlers.push(handler);
|
||
|
},
|
||
|
remove: function(el, type, selector, fn) {
|
||
|
var events = el.events;
|
||
|
if (!events || !events[type]) return;
|
||
|
var handlers = events[type];
|
||
|
var i = handlers.length;
|
||
|
var handler;
|
||
|
while (i--) {
|
||
|
handler = handlers[i];
|
||
|
if (
|
||
|
(!selector || handler.selector == selector) &&
|
||
|
handler.handler == fn
|
||
|
) {
|
||
|
handlers.splice(i, 1);
|
||
|
if (handler.selector) {
|
||
|
handlers.delegateCount--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
Event: Class({
|
||
|
className: 'Event',
|
||
|
initialize: function Event(e) {
|
||
|
this.origEvent = e;
|
||
|
},
|
||
|
isDefaultPrevented: retFalse,
|
||
|
isPropagationStopped: retFalse,
|
||
|
isImmediatePropagationStopped: retFalse,
|
||
|
preventDefault: function() {
|
||
|
var e = this.origEvent;
|
||
|
this.isDefaultPrevented = retTrue;
|
||
|
if (e && e.preventDefault) e.preventDefault();
|
||
|
},
|
||
|
stopPropagation: function() {
|
||
|
var e = this.origEvent;
|
||
|
this.isPropagationStopped = retTrue;
|
||
|
if (e && e.stopPropagation) e.stopPropagation();
|
||
|
},
|
||
|
stopImmediatePropagation: function() {
|
||
|
var e = this.origEvent;
|
||
|
this.isImmediatePropagationStopped = retTrue;
|
||
|
if (e && e.stopImmediatePropagation) e.stopImmediatePropagation();
|
||
|
this.stopPropagation();
|
||
|
}
|
||
|
})
|
||
|
};
|
||
|
|
||
|
module.exports = exports;
|