Есть еще одна проблема: порядок выполнения прослушивателей событий не определен. Чтобы обойти это, вам нужно будет самостоятельно обработать отправку события, что приведет нас к некоторому варианту предложения llimllib.
function dispatchSleightEvent(evt) {
var listeners = evt.currentTarget.sleightListeners[evt.type];
// can't use for-in because enumeration order is implementation dependent
for (var i=0; i<listeners.length; ++i) {
if (listeners[i]) {
if (! listeners[i].call(evt.currentTarget, evt)) {
return false;
}
}
}
return true;
}
function mixinSleightTarget(obj) {
if (! obj.sleightListeners) {
obj.sleightListeners = {}
obj.addSleightListener = function(type, listener) {
if (!this.sleightListeners[type]) {
this.sleightListeners[type] = [];
this.addEventListener(type, dispatchSleightEvent);
}
if (!this.sleightListeners[type+listener] {
this.sleightListeners[type+listener] = this.sleightListeners[type].length;
this.sleightListeners[type].push(listener);
}
}
obj.removeSleightListener = function(type, listener) {
if (this.sleightListeners[type+listener] {
delete this.sleightListeners[type][this.sleightListeners[type+listener]];
delete this.sleightListeners[type+listener];
}
}
}
}
Этот код полностью не проверен. Чтобы остановить отправку события, находясь на одной цели, слушатель события возвращает false
. Если вы хотите скрыть больше данных, вы можете переписать вышесказанное с точки зрения функционального программирования, хотя это может привести к утечкам памяти.