jQuery: найти левое смещение внутри $ .proxy - PullRequest
2 голосов
/ 16 января 2012
this.progress.click(function(e) { // works
    var seek = (e.pageX - this.offsetLeft) / $(this).width();
    self_ref[index].seek(seek * self_ref[index].source.duration);
});

this.progress.click($.proxy(function(e) { // doesn't work
    var seek = (e.pageX - this.offsetLeft) / $(this).width();
    this.seek(seek * this.source.duration);
}, this));

this.offsetLeft работает в первом примере, но не во втором. Мне нужно $.proxy, поэтому я не могу от этого избавиться. Я не могу найти способ заставить this.offsetLeft работать после изменения контекста внутри его функции.

PS: я больше не могу вернуться к использованию self_ref[index] из-за расширений, над которыми я работаю.

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Либо оставьте копию this во внешней области, как говорит Деннис, либо используйте e.currentTarget, чтобы получить элемент DOM, который обрабатывает событие.

this.progress.click($.proxy(function(e) { // doesn't work
    var seek = (e.pageX - e.currentTarget.offsetLeft) / $(e.currentTarget).width();
    this.seek(seek * this.source.duration);
}, this));

в вашем первом примере (без прокси): this == e.currentTarget

1 голос
/ 16 января 2012

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

var self = this;
this.progress.click(function(e) {
    var seek = (e.pageX - this.offsetLeft) / $(this).width();
    self.seek(seek * self.source.duration);
});
0 голосов
/ 16 января 2012

Редактировать: оба других ответа, очевидно, намного лучше, чем этот. Респект: -)


В первом работающем примере this - это DOMElement , по которому щелкнули: this.progress

Во втором примере, когда используется $.proxy, this относится к окружающему контексту , а не к элементу progress.

Таким образом, в обработчике Proxy вы должны использовать:

 this.progress.get(0).offsetLeft 
 // .get(0) is to obtain the DOMElement
 // and get access to the javascript property offsetLeft 

вместо this.offsetLeft.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...