Когда вы используете .bind
, ваша ссылка на наблюдаемый элемент через this
перезаписывается. Если у вас есть следующая разметка:
<div id="foo">
I am the Foo
<button id="bar">I am the Bar</button>
</div>
Без использования .bind
вы можете получить доступ к наблюдаемым и стреляющим элементам следующим образом:
function greenEggsAndHam (evt) {
console.log('Observed Element: %o', this);
console.log('Clicked Element: %o', $(evt.element()));
}
Event.observe('foo', 'click', greenEggsAndHam);
Однако, если вы хотите использовать метод класса в качестве обработчика событий и, следовательно, должны использовать .bind
, тогда решение состоит в том, чтобы включить идентификатор наблюдаемого элемента в качестве одного из аргументов обработчику событий при первом связывании событие, вот так:
var Test = Class.create({
initialize: function() {
Event.observe('foo', 'click', this.greenEggsAndHam.bind(this, 'foo'));
},
greenEggsAndHam: function (el, evt) {
console.log('Observed Element: %o', $(el));
console.log('Clicked Element: %o', $(evt.element()));
console.log('Class reference: %o', this);
}
});
var T = new Test();
Тем не менее, для согласованности я бы предложил вам использовать .bindAsEventListener
вместо .bind
и изменить обработчик событий на function (evt, el) {
, чтобы объект события был первым аргументом, а наблюдаемый элемент - вторым.