jquery - 除了前两列中的那些之外,获取表中的所有td?

时间:2012-02-10 00:58:26

标签: jquery

如何检索td's tr索引(行内)不是1或2的td?也就是说,我想跳过前两列。以下代码完成了工作,但是有更好的方法吗?我在想(td eq(0) || eq(1))类似的东西。

  $("#time-entry tr").each(function () {
            var trId = $(this).attr('id');
            $(String.format("#{0} td input[id^=txt]", trId)).each(function () { //rewrite
                var tdIndex = $(this).index();
                if(tdIndex != 1 && tdIndex != 2) {

                }
            });
        });

5 个答案:

答案 0 :(得分:5)

假设'index'是其父tr中该td的索引

$("#time-entry tr td").not(":nth-child(1), :nth-child(2)");

编辑: - 这个更短

$("#time-entry td:not(:nth-child(1), :nth-child(2))");

编辑2: -
关于通过.each()函数传递的索引:
选择器(例如$(“td”))将为您提供一个元素列表,它传递的索引是它在该列表中的索引。

编辑3: - 询问:gt()

它会查找 匹配集 的索引。因此,如果匹配的集合是表格中的所有<td>元素,则它将不适合您。它会以这种方式工作:

$("#time-entry tr").each(function () {
    $("td:gt(1)", this).each(function(){
    });
});

但我不知道为什么人们会赞成这种方式超过其他建议的方式。

答案 1 :(得分:2)

我想建议一种替代方法,完全忽略如何通过索引执行操作(您已经可以从其他答案中了解如何操作),而是尝试以简单且可维护的方式解决底层问题。

你在评论中说过,真正要做的是添加一些文本框并将行总数放在最后一列,所以对我来说直接选择它们而不是选择包含td是有意义的元素。您确实注意到前两列包含您不想选择的文本框,但我们可以很容易地允许这样做。

而不是乱搞列索引,这意味着如果以后插入/删除/重新排序列,您将不得不更改代码,我建议您为要添加的元素提供一个公共类,然后(最后一列)行总数的另一个类。所以你的标记就是这样的东西:

<tr>
   <td><input></td>
   <td><input></td>
   <td><input class="addup"></td>
   <td><input class="addup"></td>
   <td><input class="addup"></td>
   <td><input class="total"></td>
</tr>

(显然你会有其他属性,但这只是展示课程的一个示例。)

然后JS非常简单:

// process each row
$("tr").each(function() {
   var total = 0;
   // select all "addup" elements in the current row
   $(".addup", this).each(function() {
      // add to the row total, converting to a number with
      // the unary plus operator. TODO: add some validation to be
      // sure the user actually entered numeric data
      total += +this.value;
   });
   // display the total
   $(".total", this).val(total);
});

如果在中间插入不应添加的额外列,没问题:没有“addup”类,它们将被自动忽略。

另请注意,您的代码:$(String.format("#{0} td input[id^=txt]", trId))似乎正在尝试在JavaScript中间使用C#方法,这将无效。但是您不必担心尝试根据当前行的id选择元素,因为在$("tr").each()处理程序中,关键字this将引用当前行,因此您可以将其传递给{{ 1}}作为选择的上下文。就像上面显示的$()一样。

答案 2 :(得分:0)

$('tr:gt(1) td')应该这样做。

编辑:我误解了您的原始请求,并认为您想要选择除前两行之外的所有单元格。要获取除第一列之外的所有单元格,请尝试:

$('tr').each(function(){ 
    $('td:gt(1)',this).css('background','red')  
});

除了前两列中的那些单元格外,所有单元格的背景都会着色。

答案 3 :(得分:0)

您可以在回调中指定索引:

$("#time-entry tr").each(function (index, value) {
  if (index != 1 || index != 2) 
  {
    //do stuff
  }
});

答案 4 :(得分:0)

这是鱼。注意:nnnnnn的解决方案是应该使用的解决方案。

$("#time-entry tr").each(function () {
    var tr = $(this),
        total = tr.find('td input:last'),
        entries = tr.find('td:gt(1):not(td:last)').find('input'),
        totalVal = 0;

    entries.each(function() { totalVal += parseInt($(this).val()); });
    total.val(totalVal);
});