Я портирую приложение ActionScript на JavaScript и пытаюсь усовершенствовать свою реализацию EventDispatcher.
Недавняя проблема, с которой я столкнулся, заключалась в том, что прикрепленные мной обратные вызовы не вызывались с правильным значением this
. Я временно исправил это, добавив третий параметр в addEventListener
с контекстом, который нужно отправить обратно, но это не идеально, поскольку он не соответствует тому же прототипу, что и эквивалентный actioncript.
Другая вещь, которую я попробовал, - это функция в стиле this.callback, но у нее есть еще больше проблем, особенно с removeEventListener
.
Есть ли способ следовать стилю событий ActionScript в Javascript?
Моя текущая реализация приведена ниже: (зависит от jQuery / jQueryMX)
var EventDispatcher = jQuery.Class.extend({
listeners: {},
init: function() {
this.listeners = {};
},
addEventListener: function(event, listener, context) {
if (this.listeners.hasOwnProperty(event)) {
this.listeners[event].push([listener,context]);
} else {
this.listeners[event] = [[listener,context]];
}
},
hasEventListener: function() {
console.error('hasEventListener unimplemented', arguments);
},
removeEventListener: function(event, listener) {
if (this.listeners.hasOwnProperty(event)) {
for (i in this.listeners[event]) {
if (this.listeners[event][i][0] == listener) {
this.listeners[event].splice(i,1);
return true;
}
}
} else {
//console.log('no listener found for',event,listener,this);
return false;
}
},
dispatchEvent: function(event) {
if (event.type && this.listeners.hasOwnProperty(event.type)) {
event.currentTarget = this;
//console.log('dispatchEvent',event,this);
for (i in this.listeners[event.type]) {
if (typeof this.listeners[event.type][i][0] == 'function') {
this.listeners[event.type][i][0].call(this.listeners[event.type][i][1],event);
}
}
}
}
});