2

我这里有一些代码:

App.prototype.binds = function(){
    var that = this;
    $('.postlist li').live('click', function(){ that.selectPost(this);} );
}

App.prototype.selectPost = function(){
    this.function();
}

我在绑定函数中将“this”的引用创建为“that”,因此在我的 selectPost() 中,我可以使用“this”来引用 App 对象而不是列表项。

有没有更优雅/标准的解决方案而不是使用“那个”?


有了答案,我的代码就变成了:

App.prototype.binds = function(){
    $('.postlist li').live('click', $.proxy(this.selectPost, this) );
}

App.prototype.selectPost = function(e){
    this.function(); // function in App

    var itemClicked = e.currentTarget; //or
    var $itemClicked = $(e.currentTarget); 
}
4

1 回答 1

5

您可以在构造函数中或及时绑定函数:

在构造函数中

function App() {
    this.selectPost = this.selectPost.bind( this );
                   //$.proxy( this.selectPost, this ) in jQuery
}

App.prototype.binds = function(){
    $('.postlist li').live('click', this.selectPost ); //Already bound in constructor
}

及时:

App.prototype.binds = function(){
    $('.postlist li').live('click', this.selectPost.bind( this ));
                                    //$.proxy( this.selectPost, this ) in jQuery
}

请注意,.bind仅在较新的浏览器中受支持,jQuery$.proxy应该是首选。

我在 jQuery 中打开了一个已被接受的功能请求http://bugs.jquery.com/ticket/12031。使用 jQuery 事件时,这将使这更容易。

请注意,有一个常见的误解,即在 jQuery 事件处理程序e.target中将与正常情况相同。this它实际上是e.currentTarget。所以现在它this指的是实例而不是元素,你可以通过e.currentTarget.

于 2012-11-19T11:24:05.197 回答