jQuery: переключение с addEventListener на привязку - PullRequest
0 голосов
/ 18 января 2012

Оригинальный код:

this.control.addEventListener('click', $.proxy(function() {
    this.time.hashours = (this.duration() / 3600) >= 1.0;
    this.time.duration.text(getTime(this.duration(), this.controls.time.hasHours));
    this.time.current.text(getTime(0, this.controls.time.hasHours));
}, this));

Попытка кросс-браузерной поддержки:

$(this.control).bind('click', $.proxy(function(e) {
    var o = e.delegateTarget;
    o.time.hashours = (o.duration() / 3600) >= 1.0;
    o.time.duration.text(getTime(o.duration(), o.controls.time.hasHours));
    o.time.current.text(getTime(0, o.controls.time.hasHours));
}, this));

Даже с прокси контекст этого больше не принадлежит вызывающему объекту из-за пользовательской модели событий jQuery. Как я могу получить оригинал this.control?

Ответы [ 3 ]

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

Даже с прокси контекст этого больше не принадлежит вызывающему объекту из-за пользовательской модели событий jQuery.

Я не думаю, что проблема здесь в пользовательской модели событий jQuery. Когда вы проксируете функцию обратного вызова, значение this должно ссылаться на корневой объект, который содержит control и другие свойства, такие как ctime и time, как в исходном примере.

Другими словами, не пытайтесь получить исходный объект, подобный этому, из delegateTarget

var o = e.delegateTarget;
o.time.hashours = (o.duration() / 3600) >= 1.0;
...

но просто придерживайтесь своего исходного кода,

this.time.hashours = (this.duration() / 3600) >= 1.0;

Оформить заказ на этот минимальный пример , который напоминает вашу структуру.

0 голосов
/ 18 января 2012

Если вы хотите использовать this.control внутри обработчика событий click, вам следует сделать что-то вроде этого.

var $context = this;
$(this.control).bind('click', function(e) {
    //You can use $context here
    //var o = e.delegateTarget;
    $context.time.hashours = ($context.duration() / 3600) >= 1.0;
    $context.time.duration
    .text(getTime($context.duration(), $context.controls.time.hasHours));
    $context.time.current.text(getTime(0, $context.controls.time.hasHours));

    //And this will point to this.control on which the event is triggered
});
0 голосов
/ 18 января 2012

Я не уверен, отвечает ли это на ваш вопрос, но пользовательский объект события jQuery включает в себя исходное событие. Он доступен так: e.originalEvent, где e - это событие jQuery.

Кроме того, только для справки, начиная с jQuery 1.7, метод .on предпочтительнее, чем .bind, см .: http://api.jquery.com/bind/

...