【问题标题】:jQuery, HTML table and .last()jQuery、HTML 表格和 .last()
【发布时间】:2016-05-27 21:34:11
【问题描述】:

我在看一本关于jQuery和HTML的书,有一点看不懂,找了一个半小时,网上也找不到答案,所以直接在这里问.所以我的页面上有一个表格:

<table>
  <thead>
    <th>Nom</th>
    <th>T&eacute;l&eacute;phone</th>
    <th>Courriel</th>
    <th>Compagnie</th>
    <td>Dernier contact</td>
  </thead>

  <tbody>
    <tr>
      <td>William Smith</td>
      <td>(555) 642-7371</td>
      <td>william@testing.com</td>
      <td>Acme Industries</td>
      <td>
        <time datetime="2014-10-21">2014-10-21</time>
        <div class="overlay">These are my notes for William</div>
      </td>
    </tr>
    <tr>
      <td>Bob Morris</td>
      <td>(555) 748-4465</td>
      <td>Bob@moretesting.com</td>
      <td>ABC Corp</td>
      <td>
        <time datetime="2015/01/01">2015/01/01</time>
        <div class="overlay">Notes pour Bob</div>
      </td>
    </tr>
    <tr>
      <td>Ted Mosus</td>
      <td>(555) 484-9835</td>
      <td>Ted@SomeEmail.com</td>
      <td>Tada Inc.</td>
      <td>
        <time datetime="2016/05/21">2016/05/21</time>
        <div class="overlay">Ne pas appeler avant 10:00 AM</div>
      </td>
    </tr>
    <tr>
      <td>Yvan Doc</td>
      <td>(555) 258-7946</td>
      <td>yvan@doc.com</td>
      <td>ABC Corp</td>
      <td>
        <time datetime="2015/07/18">2015/07/18</time>
        <div class="overlay">Non non ce n'est pas un docteur!</div>
      </td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <td colspan="5">4 contacts displayed</td>
    </tr>
  </tfoot>
  <caption>Contact des ventes</caption>
</table>

当我在 Chrome 中打开控制台时,我输入以下命令

$('time').siblings('.overlay').parents('tr').last();

现在我希望它会返回“Yvan Doc”行,这是我表中的最后一行,但不,它会返回“William Smith”行,当我将 .last() 更改为 .first (),它返回给我的是 'Yvan Doc' 而不是 'William Smith'。

有人可以向我解释一下为什么桌子似乎是倒置的吗?

【问题讨论】:

    标签: jquery html html-table


    【解决方案1】:

    原因实际上在于.parents() 而不是.last()。如果您阅读.parents() 的文档,它会指出(强调我的):

    当原始集合中有多个 DOM 元素时,结果集合 也将与原始元素的顺序相反 已删除重复项。

    您可能对使用 .closest() 更感兴趣,当使用 $('time').siblings('.overlay').closest('tr').last() 时将返回 Yvan Doc 行。

    【讨论】:

    • 啊...我正在查看 .last() 文档...解释了它,感谢您的回答!
    • $('table').children('tbody').children().last() 也会返回 Yvan Doc 行。
    • 匿名投票者愿意评论问题所在吗?
    【解决方案2】:

    您可以将.closest().find().first() 一起使用:

    $('time').closest('tbody').find('tr').first();
    

    【讨论】:

      【解决方案3】:

      你面临的问题是你从一个多重选择器开始(选择所有带有“时间”标签的元素),然后获取所有的兄弟姐妹,然后获取他们所有的父母,然后尝试找到最后一个.您的代码在使用返回多个元素的选择器时尝试查找单个项目。

      您应该抓住&lt;tbody&gt; 元素并使用以下方法获取它的最后一个子元素&lt;tr&gt;

      $('tbody tr').last();
      

      如果您的页面上有多个 &lt;tbody&gt;,请为其提供一个唯一 ID 并按如下方式访问它:

      $('#tbody-name:last-child');
      

      【讨论】:

      • 选择器之间应该有空格。但那将是错误的目标。
      • 这行得通,但不幸的是它没有解释它。不过感谢您的回答!
      • 我编辑了我的评论。使用 ID 并选择“last-child”将是最节省内存的方式,也是最简洁的方式,imo,但已投票。
      • 非常感谢您在帖子中提供的信息,它可以正常工作并且很有帮助,但是我试图了解它为什么会这样工作,因为我正在通过阅读代码进行培训。您的帖子仍然有帮助!
      • 没问题。我知道你的代码试图做什么,但我无法准确解释为什么你的过程会导致得到“Yvan”而不是“Will”&lt;tr&gt;,但我知道这与告诉多个元素定位有关同时一个元素。 Imo,在元素上放置类或 ID 永远不会有什么坏处。有助于更好地隔离您的代码以进行 DOM 访问或操作,并避免在您尝试只关注一个时无意中选择多个 DOM 元素的可能错误。此外,就内存使用而言,方法链接和遍历越少越好。
      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多