【问题标题】:How to use "this" in jQuery?如何在 jQuery 中使用“this”?
【发布时间】:2012-11-27 01:52:43
【问题描述】:

我有一些重复的代码,如下所示,我想删除重复的代码,以实现“DRY”(不要重复自己)原则。任何人都可以帮助我将不胜感激!

Javascript 代码如下:

<script type="text/javascript">
    $(document).ready(function () {

        $(".adjustLineFeedProductName").ready(function () {
            var str = "";
            for (i = 0; i < $(".adjustLineFeedProductName").html().length; i += 66) {
                str = str + "<p style=\"margin: 0px 0px 0px 0px;\">" + $(".adjustLineFeedProductName").html().substring(i, i + 66) + "</p>";
            }
            $(".adjustLineFeedProductName").html(str);
        });

        $(".adjustLineFeedQuantityPerUnit").ready(function () {
            var str = "";
            for (i = 0; i < $(".adjustLineFeedQuantityPerUnit").html().length; i += 66) {
                str = str + "<p style=\"margin: 0px 0px 0px 0px;\">" + $(".adjustLineFeedQuantityPerUnit").html().substring(i, i + 66) + "</p>";
            }
            $(".adjustLineFeedQuantityPerUnit").html(str);
        });

    });
</script>

HTML代码如下:

<div class="elaborate" style="margin: 0px 0px 0px 0px; padding: 0px 0px 3px 10px;"><b class="adjustLineFeedProductName"><%: (string)Model.Product.ProductName %></b></div>
<div class="elaborate" style="margin: 0px 0px 0px 0px; padding: 3px 0px 0px 10px;"><span class="adjustLineFeedQuantityPerUnit">Quantity/Unit : <%: (string)Model.Product.QuantityPerUnit %></span></div>

我想用下面的 Javascript 代替上面的 Javascript,但它不起作用:

<script type="text/javascript">
    $(document).ready(function () {
        $(".adjustLineFeed").ready(function () {
            var str = "";
            for (i = 0; i < this.html().length; i += 66) {
                str = str + "<p style=\"margin: 0px 0px 0px 0px;\">" + this.html().substring(i, i + 66) + "</p>";
            }
            this.html(str);
        });
    });
</script>

我尝试使用下面的 html 代码而不是上面的 html 代码,但它不起作用:

<div class="elaborate" style="margin: 0px 0px 0px 0px; padding: 0px 0px 3px 10px;"><b class="adjustLineFeed"><%: (string)Model.Product.ProductName %></b></div>
<div class="elaborate" style="margin: 0px 0px 0px 0px; padding: 3px 0px 0px 10px;"><span class="adjustLineFeed">Quantity/Unit : <%: (string)Model.Product.QuantityPerUnit %></span></div>

【问题讨论】:

  • this 是一个原生 DOM 元素,你必须把它包装起来 -> $(this)

标签: javascript jquery jquery-selectors jquery-events


【解决方案1】:

在 jQuery 块中,this 将引用 HTMLDomElement 实例。在这一点上,您可以执行类似 DOM 的操作,例如 innerHTML 等,但显然您不能执行 jQuery 方法,因为它不是 jQuery 对象。

要创建一个 jQuery 对象,像这样将 DOM 元素传递给$

$(this)

其他几点;

  1. $(".adjustLineFeedProductName").ready() 毫无意义。 spanbr从不 ready;我很惊讶这甚至有效。将您的代码放在$(document).ready() 中就足够了。您可能想要的是使用jQuery.each(),这样您就可以在页面上定位.adjustLineFeedProductName.adjustLineFeedQuantityPerUnit所有 个实例(如果只有一个实例,请考虑使用ID)。 p>

    $(".adjustLineFeedProductName").each(function () {
        var str = "";
        for (i = 0; i < $(this).html().length; i += 66) {
            str = str + "<p style=\"margin: 0px 0px 0px 0px;\">" + $(this).html().substring(i, i + 66) + "</p>";
        }
        $(this).html(str);
    });
    
  2. 缓存$()的响应。 $(this)$() 每次调用它时都会在幕后工作。虽然 DOMElements 的工作量并不大,但养成缓存这些内容的习惯是一个好习惯。例如,jQuery 选择器执行的 DOM 查找并不简单。

    $(".adjustLineFeedProductName").each(function () {
        var str = "";
        var self = $(this); // cache
    
        for (i = 0; i < self.html().length; i += 66) { // use self
            str = str + "<p style=\"margin: 0px 0px 0px 0px;\">" + self.html().substring(i, i + 66) + "</p>"; // use self
        }
        self.html(str);
    });
    
  3. 与 #2 类似,同样缓存 html()

     $(".adjustLineFeedProductName").each(function () {
        var str = "";
        var self = $(this); // cache
        var html = self.html();
    
        for (i = 0; i < html.length; i += 66) { // use self
            str = str + "<p style=\"margin: 0px 0px 0px 0px;\">" + html.substring(i, i + 66) + "</p>"; // use self
        }
        self.html(str);
    });
    

【讨论】:

  • $(this) 如果 this 已经是一个 DOM 元素,则不会进行“DOM 查找”,它只是将该元素包装在一个 jQuery 对象中。
  • @Alnitak:嗯,你是对的。这就是为什么我不应该在周末回答 SO 问题...:P。
  • @Matt 当然,缓存对象仍然是一个好主意。你也应该缓存html.length,当你在它的时候。
【解决方案2】:

正确的代码应该是这样的:

$(this).html()

【讨论】:

    【解决方案3】:

    改变这个:

    this.html(str);
    

    到这里:

    $(this).html(str);
    

    【讨论】:

      【解决方案4】:

      感谢“马特”!!!我按照你的建议修改了代码,效果很好!!!

      Javascript 代码如下:

      <script type="text/javascript">
          $(document).ready(function () {
              $(".adjustLineFeed").each(function () {
                  var str = "";
                  var self = $(this); // cache
                  var html = self.html();
                  for (i = 0; i < html.length; i += 66) {
                      str = str + "<p style=\"margin: 0px 0px 0px 0px;\">" + html.substring(i, i + 66) + "</p>";
                  }
                  self.html(str);
              });
          });
      </script>
      

      HTML代码如下:

      <div class="elaborate" style="margin: 0px 0px 0px 0px; padding: 0px 0px 3px 10px;"><b class="adjustLineFeed"><%: (string)Model.Product.ProductName %></b></div>
      <div class="elaborate" style="margin: 0px 0px 0px 0px; padding: 3px 0px 0px 10px;"><span class="adjustLineFeed">Quantity/Unit : <%: (string)Model.Product.QuantityPerUnit %></span></div>
      

      【讨论】:

        猜你喜欢
        • 2019-08-09
        • 2011-01-28
        • 2011-07-19
        • 2012-08-18
        • 2012-07-31
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多