Можете ли вы использовать что-то вроде в этом примере jsfiddle ?this
- объект, для которого происходит событие щелчка.self
- это A
объект.
Function.prototype.bind = Function.prototype.bind || function(scope) {
var fn = this;
return function () {
fn.apply(scope, arguments);
};
};
A = function() {};
A.prototype.click = function (el) {
var self = this;
var onClick = function () {
el.removeEventListener('click', onClick, false);
alert("this=" + this + "\nself=" + self + "\nel=" + el + "\nclicked");
}
el.addEventListener('click', onClick, false);
}
A.prototype.toString = function () {
return "I am an A!";
}
a = new A();
a.click(document.getElementById("a1"));
a.click(document.getElementById("a2"));
Обновление 1 - второй пример здесь .Основные отличия ниже.
function createOnClickHandler (scope, outerThis, el) {
var onClick = (function (evt) {
el.removeEventListener('click', onClick, false);
alert("this=" + this + "\nouterThis=" + outerThis + ", \nel=" + el + "\nclicked");
}).bind(scope);
return onClick;
}
A = function() {};
A.prototype.click = function (el) {
var ob = {
toString: function () {
return "I am an ob!";
}
};
el.addEventListener('click', createOnClickHandler(ob, this, el), false);
}
Обновление 2 - общий пример одноразового обработчика событий , который связывает ваш обработчик событий с определенной областью, вызывает этот обработчики отменяет регистрацию слушателя.
function createOneTimeHandler (evtName, fn, scope, el) {
var bound = fn.bind(scope);
var onEvent = function (evt) {
el.removeEventListener(evtName, onEvent, false);
bound(evt);
};
el.addEventListener(evtName, onEvent, false);
}