【问题标题】:$(this) OR event.target OR var input = $(this)$(this) OR event.target OR var input = $(this)
【发布时间】:2011-03-24 05:08:25
【问题描述】:

在我快乐地生活了 12 年后,jQuery 目前正在为我提供一个有趣的 Javascript 介绍。我正处于尝试尽可能多地学习优化我编写的代码的阶段,虽然我找到了很多很好的参考资料,但有一些非常基本的东西让我感到困惑,我一直无法在任何地方都可以找到有关它的任何信息。

当我将某些东西附加到一个元素时,我应该如何在函数中引用该元素。例如,将函数附加到元素的点击事件时:

$('#a_button',$('#a_list_of_buttons')).click(function() {
    // NOW WHAT'S THE BEST WAY TO REFER TO '#a_button' ?
});

我知道不要像这样一直重新选择它,因为浏览器必须从头开始重新搜索整个 DOM 才能找到它已经找到的内容:

$('#a_button').click(function() {
    // I KNOW THAT THIS IS NAUGHTY
    var buttonValue = $('#a_button').val();
    $('#a_button').addClass('button_has_been_clicked');

});

目前我正在使用以下任何一种,但不完全确定每个人实际上在做什么:

$('#a_button').click(function() {
    // USING this
    var buttonValue = $(this).val();
    $(this).addClass('button_has_been_clicked');
});

但这只是像第一个“顽皮”示例中那样重新选择吗?

$('#a_button').click(function(event) {
    // USING event.target
    var buttonValue = $(event.target).val();
    $(event.target).addClass('button_has_been_clicked');
});

这看起来可能更好,但多次引用“event.target”是否有效?

$('#a_button').click(function(event) {
    // USING A LOCAL VARIABLE
    var thisButton = $(this);

    // OR SHOULD THAT BE
    var thisButton = $(event.target);

    var buttonValue = thisButton.val();
    thisButton.addClass('button_has_been_clicked');
});

我了解将事物传递给变量的性能效率,但我不确定在这些情况下使用 $(this) 或 $(event.target) 是否已经为我提供了相同的效率,因此通过设置一个新变量我实际上正在做更多我需要做的工作。

谢谢。

【问题讨论】:

    标签: javascript jquery optimization


    【解决方案1】:

    我构建了一个小示例来演示 thise.target 的实际工作原理:http://jsfiddle.net/xZAVa/

    【讨论】:

      【解决方案2】:

      我可能错了,但thisevent.target 只是对同一元素的不同引用。

      thisevent.target 不是总是 对同一元素的引用。但在回答您的问题时,var thisButton = $(this); 绝对是赢家。如果您正在编写 C# 代码,则永远不会执行以下操作:

      this.Controls[0].Controls[0].Text = "Foo";
      this.Controls[0].Controls[0].Controls.Clear();
      

      你会这样做:

      var control = this.Controls[0].Controls[0];
      

      因此,您可能也不应该多次重复使用$(this)。尽管将 this 从 DOM 元素转换为 jQuery 对象很简单,但仍然是不必要的开销。

      但是,有时您需要从优化中恢复,以确保您的代码保持其可读性。

      当然,另一种选择就是更改 this 是什么。这是javascript之后的:

      this = $(this); // Now `this` is your jQuery object
      

      免责声明:我只是尝试了上述方法,它似乎有效。不过可能有一些问题。

      【讨论】:

      • 事件对象的 target 属性在 jQuery 中进行了规范化,并且在它支持的所有浏览器中都可以正常工作。它并不总是与this 相同。
      • @GenericTypeTea - 你的获胜方法是我在我读过的几乎所有参考资料中看到的,但没有在哪里解释他们为什么使用这种方法,除了使用应避免使用 $('#a_button') 等价物,因为无论何时使用它都需要重新查找 DOM。
      • @Chris - 这是成功的解决方案,因为正是您所说的。它停止了不必要的 DOM 查找。一旦你从 DOM 分配了一次值,你就得到了 jQuery 对象,直到它超出范围。
      • @GenericTypeTea - 你的回答对我来说很有意义,但我现在很困惑,因为@Wallace Breza 和@Baju 的回答似乎表明 $(this) 和 $(event.target) 是在这种情况下执行与本地设置变量相同的工作,即对元素的无开销引用,我可以在它仍在范围内时重复使用而不会受到惩罚。
      • @GenericTypeTea - ...我完全同意你关于优化性能和优化可读性/可维护性之间的平衡的评论,我只是想尽可能多地学习,以便我可以达到我知道的最佳平衡。
      【解决方案3】:

      thisevent.target 并不总是相同的。 this 指的是您将侦听器分配给的元素(在本例中为 '#a_button' )。但event.target 是实际触发事件的元素,它可以是#a_button 的子节点。

      所以$(this) 就是你要找的东西。

      见参考:http://api.jquery.com/event.target/

      【讨论】:

      • 正是 'this' 和 'event.target' 相同的情况让我感到困惑。
      【解决方案4】:

      根据我的经验,我会选择以下方法:

      $('#a_button').click(function() {
          // USING this
          var buttonValue = $(this).val();
          $(this).addClass('button_has_been_clicked');
      });
      

      点击回调方法上下文中的this 是对DOM 事件的引用。由于您已经拥有对 DOM 对象的引用,因此将其转换为 jQuery 对象很简单,因为不需要查找。

      但附带说明一下,如果您不需要在回调中使用 jQuery,那就不要。您可以使用标准 JS this.currentTarget.value 简单地获取按钮的值。

      您提到的其他示例需要 DOM 查找,并且根据选择器的复杂性可能需要更长的时间。使用像 '#a_button' 这样的基于 id 的查找将比像 .myClass 这样的基于类的查找性能更好。

      【讨论】:

      • 澄清一下,使用“event.target”是否需要额外的 DOM 查找?哦,学习一些 jQuery 东西的标准 Javascript 绝对是我要做的事情的清单,谢谢你的注意。
      • @Chris Stevenson - 不,event.target 已经包含引发事件的 DOM 元素,不需要额外的查找。所以$(this) 将与您的示例中的$(event.target) 相同。
      猜你喜欢
      • 1970-01-01
      • 2017-01-27
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多