Проблема привязки jquery "this" к обработчику событий (эквивалент bindAsEventListener в прототипе) - PullRequest
8 голосов
/ 19 мая 2010

В jquery привязка хэдлера событий - это элемент DOM, генерирующий событие (это указывает на элемент dom).В прототипе для изменения привязки обработчика событий можно использовать функцию bindAsEventListener ;Как я могу получить доступ как к экземпляру, так и к элементу DOM из обработчика событий?
По аналогии с Как связать обработчик событий с экземпляром в JQuery?

function Car(){
    this.km = 0;
    $("#sprint").click(this.drive); //setup event handler
}

// event handler
// in it I need to access both the clicked element
// and the binding object (instance of car)
Car.prototype.drive = function(){
    this.km += 10; // i'd like to access the binding (but jq changes it)
    this.css({ // also the element
        left: this.km 
    }); 
    // NOTE that is inside this function I want to access them not elsewhere
}

var car = new Car();

Ответы [ 4 ]

4 голосов
/ 01 июня 2010

Хм, может быть вы можете использовать jQuery.proxy ()?

http://api.jquery.com/jQuery.proxy/

1 голос
/ 19 мая 2010

Просто привяжите переменную к this и используйте ее.

function Car(){
    this.km = 0;
    var that = this;
    $("#sprint").click(function(){
         that.drive(this);
    });
}


Car.prototype.drive = function(element){
    this.km += 10; // i'd like to access the binding (but jq changes it)
    this.css({ // also the element
        left: this.km 
    }); 
    alert(element.innerHTML);
    // NOTE that is inside this function I want to access them not elsewhere
}

Обработчик передает элемент в экземпляр

0 голосов
/ 19 мая 2010

хорошо, вот вы:

var car = {km:0};
$("#sprint").click(function(){
    car.km += 10;
    $(this).css({ left: car.km });
});

Я не проверял это, но должен быть прямым, или то, где вы ошиблись, находится на вашем "this", которое смотрит на элемент "sprint", а не на объект "car".

0 голосов
/ 19 мая 2010

В противном случае значение this (то есть элемент, к которому прикреплен обработчик) также передается в свойстве currentTarget объекта события. Итак, если вы используете функцию привязки, о которой вы говорили:

Car.prototype.drive = function(e) {
    // this will be your car object
    // e.currentTarget will be the element that you attached the click handler to
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...