jQuery:从addEventListener切换到bind

时间:2012-01-17 20:13:25

标签: jquery this bind addeventlistener

原始代码:

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 个答案:

答案 0 :(得分:2)

  

即使使用代理,由于jQuery的自定义事件模型,它的上下文不再属于调用对象。

我不认为jQuery的自定义事件模型是这里的问题。代理回调函数时,this值应引用包含control的根对象以及原始示例中的ctimetime等其他属性。< / p>

换句话说,不要试图从delegateTarget

获取这样的原始对象
var o = e.delegateTarget;
o.time.hashours = (o.duration() / 3600) >= 1.0;
...

但只是坚持原始代码,

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

查看与您的结构类似的最小example

答案 1 :(得分:0)

我不确定这是否能回答您的问题,但jQuery的自定义事件对象包含原始事件。它可以这样访问:e.originalEvent其中e是jQuery事件。

另外,仅仅是FYI,从jQuery 1.7开始,.on方法优先于.bind,请参阅:http://api.jquery.com/bind/

答案 2 :(得分:0)

如果你想在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
});