【问题标题】:Avoiding var _this = this; when writing jQuery event handlers避免 var _this = this;在编写 jQuery 事件处理程序时
【发布时间】:2011-10-12 14:01:00
【问题描述】:

不是一个非常重要的问题,但我们开始吧..

如何避免在 jQuery 事件处理程序中使用 var _this = this? 即我不喜欢这样做:

var _this = this;
$(el).click(function (event) {
  //use _this to access the object and $(this) to access dom element
});

以下2种方式都不理想

$(el).click($.proxy(function (event) {
  //lost access to the correct dom element, i.e. event.target is not good enough (see http://jsfiddle.net/ne3n3/1/)
}, this));

$(el).click({_this: this}, function (event) {
  //have access to $(this) and event.data._this, but it seems too verbose
})

理想情况下,我想做类似的事情

$(el).click(function (event) {
  this.method(); // this is accessing the object
  event.realTarget; // this is accessing the dom element
}, this); // <= notice this

【问题讨论】:

  • 请解释为什么你认为“event.target 不够好”? jQuery 总是返回自己的格式正确的事件对象,并带有正确的 event.target 值。
  • 我一开始就不打字来避免它....
  • 当我说“不够好”时,我的意思是:jsfiddle.net/ne3n3 event.target 和 jQuery 在处理程序中为我准备的 this 之间存在差异

标签: javascript jquery syntax


【解决方案1】:

http://api.jquery.com/event.currentTarget/ 说:

“此属性通常等于函数的 this。”

http://jsfiddle.net/ne3n3/2/

【讨论】:

  • 你知道这个事件属性是 jQuery 设置的还是 DOM 的东西?
  • 从 jQuery 1.3 开始加入,所以必须是 jQuery 的特性。
【解决方案2】:

我不完全确定我理解你的意思,但是如果你想要的是对你在创建回调函数时所在的函数的引用,你可以这样做(虽然它不是完全节省您的任何打字时间):

$(el).click(function(parent) {
    return function() {
        // Use parent instead of _this
    }
}(this))

【讨论】:

  • 这看起来很有趣。我想这不是为了节省打字,而是为了提高可读性。
  • @Karolis 如果你想提高可读性,不要称之为_this,而是在上下文/语义上有意义的东西。要么以这种方式(但选择一个有意义的名称),要么以原始方式——这与你将获得的可读性差不多,IMO。
  • 是的,我想是的。有点烦人的是,在我的大多数回调中,我代理/dojo.hitch 'this'(如果需要的话),而 jQuery 事件处理程序是他们以特殊方式处理 'this' 的唯一例外。也许,jQuery 可以将 dom 元素的引用作为参数传递,而不是触摸“this”。 IE。 .bind( eventType, [eventData,] handler(eventObject, domElement) )
【解决方案3】:

您不能将变量 this 分配给对象和 DOM 元素。我的建议是将对象分配给与this 不同的变量。

同时访问对象和 DOM 元素的最佳方式如下:

$(el).click($.proxy(function (event) {
  // can reference DOM element with this i.e. $(this)
  // can reference your object with the variable myObject
  //     i.e. $(this).val(myObject.data);
}, myObject));

或者可能是这样的:

$(el).click({myObject: this}, function (event) {
  //have access to $(this) and event.data.myObject, but it seems too verbose
});

在点击事件处理函数中使用除this 以外的变量也会使您的代码更清晰,因为大多数人都希望this 引用DOM 元素而与您的自定义对象无关。

【讨论】:

  • 您的第一个示例不起作用,因为我没有对 myObject 的引用。我可以做 var myObject = this;但这与 var _this = this; 相同
  • 您的第二个示例有点烦人,因为当您可以使用此关键字执行此操作时, event.data.myObject 感觉输入过多。如果这有意义的话。
  • 啊,第一个例子你是对的。我忘记了 $.proxy() 将传入的对象引用重新分配给这个。我的错。
猜你喜欢
  • 2011-08-09
  • 2016-09-21
  • 1970-01-01
  • 2013-07-13
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多