2

我有一个对象,ChatHandler它拥有一个 div,它的 div 包含一些其他 dom 元素。然后,我将一个事件处理程序绑定到其中包含的 DOM 元素的某个子集,如下所示:

$(this.element).find('.render-box').unbind('click').click(this.handleBoxClick);

我指定了一些函数来处理这些点击。

ChatHandler.prototype.handleBoxClick = function(event) {
    // 'this' refers to a DOM object. 
    var partner = $(this).attr('partnerid');
    // But now I want to be able to access a public attribute of this object.
    this.myAttribute = partner;
}

然后如何访问我的 ChatHandler 对象的公共成员/函数?我假设我无法更改执行上下文,但必须有某种我缺少的方法来做到这一点。

4

3 回答 3

2

通过知道您的 ChatHandler 对象的包装函数显式传递元素。

this将引用该对象,并且该元素仍可用作参数。

var handler = this;

$(this.element).find('.render-box').unbind('click')
  .click(
    function(event) {
      handler.handleBoxClick(this, event);
    } 
  );

// ...

ChatHandler.prototype.handleBoxClick = function(el, event) {
  var partner = $(el).attr('partnerid');
  this.myAttribute = partner;
};
于 2013-05-05T02:47:38.213 回答
2

用于$.proxy绑定this值。

$(this.element).find('.render-box')
               .unbind('click')
               .click($.proxy(this, "handleBoxClick"));

或者,如果您需要this在处理程序中保留默认值,您可以将对象作为事件数据传递。

$(this.element).find('.render-box')
               .unbind('click')
               .click(this, this.handleBoxClick);

然后通过event.data处理程序访问它。

ChatHandler.prototype.handleBoxClick = function(event) {
    var partner = $(this).attr('partnerid');
    event.data.myAttribute = partner;
}
于 2013-05-05T02:53:58.723 回答
0

抛弃原型,我会去掉任何this关键字——它会变得混乱:

ChatHandler = function() {
    var self = this;
    self.element = document.getElementById("wtv");
    self.myAttribute = undefined;
    self.handleBoxClick = function() {
        var partner = $(self.element).attr('partnerid');
        self.myAttribute = partner;
    }
    $(self.element).find('.render-box').unbind('click').click(self.handleBoxClick);
};

new ChatHandler();
于 2013-05-05T02:43:01.543 回答