【问题标题】:jQuery select table cells with specific headerjQuery选择具有特定标题的表格单元格
【发布时间】:2010-07-07 23:39:18
【问题描述】:

我有一个带有“标题”的表格,用户使用常规 tr 标签(不是 th)。我需要找到标题“Col2”,然后在 Col2 下的每个单元格中添加一个锚点。我可以做$("td:contains('Col2')) 来查找标题,但数据行也可能有“Col2”。如何只搜索第一行然后循环遍历行单元格?

<table>
  <tr>
    <td>Col1</td>
    <td>Col2</td>
  </tr>
  <tr>
    <td>Data1</td>
    <td>Data2</td>
  </tr>
  <tr>
    <td>Data3</td>
    <td>Data4</td>
  </tr>
</table>

变成:

<table>
  <tr>
    <td>Col1</td>
    <td>Col2</td>
  </tr>
  <tr>
    <td>Data1</td>
    <td><a href="?Data2">Data2</a></td>
  </tr>
  <tr>
    <td>Data3</td>
    <td><a href="?Data4">Data4</a></td>
  </tr>
</table>

编辑:我实际上在同一页面中有多个表格。 :first 只匹配第一个表中的第一行。

更新:这是我最终得到它的方法。感谢大家的帮助!从你们每个人那里得到一点,从 API 文档中得到一点,它就可以工作。现在我开始掌握它的窍门,我无法想象没有 jQuery 做这件事的痛苦。

$('table').each(function(i, table) {
    $(table).find('tr:first > td:contains("Col2")').each(function() {
        var cellIndex = $(this).index() + 1;

        $(table).find('tr:not(:first) > td:nth-child(' + cellIndex + ')').wrapInner(function() {
            return $('<a />', { 'href': '?data=' + $(this).text() });
        });
    });
});

【问题讨论】:

    标签: jquery jquery-selectors


    【解决方案1】:

    您可以像这样使用.index().wrapInner(function) 来做到这一点:

    var i = $("table tr td:contains('Col2')").index() + 1;
    $("table tr:gt(0) td:nth-child(" + i +")")​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.wrapInner(function() {
        return $("<a />", { "href": "?" + $(this).text() });
    });​
    

    You can see an example here,这将获取包含"Col2"(基于0)的&lt;td&gt; 的索引,然后使用:nth-child() selector(基于1,因此我们添加1)来获取&lt;td&gt; 元素你想.wrapInner()。之后,我们只是返回通过$(html, props) 生成的结构来包装它们。

    【讨论】:

    • 这实际上包裹了整个单元格:&lt;a ...&gt;&lt;td&gt;...&lt;/td&gt;&lt;/a&gt;,给出了有趣的结果。我将如何只包装单元格内容?
    • @Nelson - 那应该是.wrapInner(),我的疏忽...答案/演示已更新为正确的代码:)
    • 我从其他人那里得到了一些帮助,但你的帮助最大,所以我会接受你的回答。不过,我仍然无法让它与同一页面上的多个表一起使用。我把它分成$("table").each(function(i, elem) { $(elem).children("tr:first &gt; td:contains('Col2')").text('hello') }); 如果我取出.children(...),所有的表都被'hello'替换。使用 .children(...),只有第一个表有效。我检查了三次,所有表的结构都相同。
    • 另外,不知道我该如何解释,但$(elem).children("tr:first").css('background-color', 'blue'); 在第一个 tr 上改变了背景。 $(elem).children("tr").css('background-color', 'blue'); 不做任何事情。我认为我的问题是 $(elem)。
    • 我仍然不确定如何解释,但我的问题是使用 .children() 而不是 .find()。我遗漏的一个细节是有一个 标记,因此 不是直接子代。我已经用我的最终解决方案更新了我的问题。
    【解决方案2】:

    [See it in action]

    var index = $("table:first-child td:contains('Col2')").index() + 1;
    $("tr:not(:first) :nth-child("+index+")").each(function(){
       var old = $(this).html();
       $(this).html("<a href='?"+old+"'>"+old+"</a>");                                          
    });
    

    【讨论】:

    • 这与示例不匹配,第二个应该是Data4 :) 它是每个单元格的,因此您需要考虑到这一点。
    • 编辑后,您应该考虑在旧 html 中存在 ' 的可能性。 .html() 也可以在 1.4+ 中使用一个函数,这样做更干净......尽管.wrap() 在这里是一种更好/更安全的方法。
    • 与尼克的非常相似。
    • 获取特定单元格/标题的索引仍然非常有效。在我的具体情况下,这成功了: var index = $("th:contains('mySearchPattern')", this.parent().parent()).index() + 1;
    【解决方案3】:

    您是否尝试过使用“:first”选择器(包括“not(:first)”)

    http://api.jquery.com/first-selector/

    【讨论】:

    • "td:first:contains('Col2')" 不起作用。聚合过滤器的正确语法是什么?
    • $('table &gt; tbody &gt; tr:first &gt; td:contains("Code")') 有点工作。我有几张桌子,它只拿起第一张。
    • 同样,not(:first) 在其他表中获取第一个 tr
    【解决方案4】:

    我会做以下事情:

    搜索具有匹配条件的列的标题行,然后获取列索引。然后选择表中从在该列索引处找到的第二行开始的所有行。然后创建你的锚。如果您需要帮助,我可以尝试编写一些代码。

    【讨论】:

    • 我不确定如何循环遍历每个。我试着做$("...").each(function() { How do I get the index here? });
    • i 最终为 0,即使它是第二列。如果我将each(...) 替换为css(...),它会更改正确的单元格。有什么想法可以通过这种方式获得正确的索引吗?
    • 我明白了,i 是 0,因为它是第一个匹配项,而不是单元格的索引。
    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 2013-04-18
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2012-03-27
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多