【问题标题】:jQuery - Count number/Get Index of rowspan rowsjQuery - 计数/获取行跨行的索引
【发布时间】:2012-06-25 20:49:27
【问题描述】:

我试图弄清楚如何获取当前行跨度“行”的索引(即使它是行跨度的单元格)。

<table>
    <tr>
        <td rowspan="2">First</td>
        <td> First 1 1 </td>
        <td> First 2 1 </td>
    </tr>
    <tr>
         <td> First 2 1 </td>
         <td> First 2 2 </td>
    </tr>
    <tr>
        <td rowspan="2">Second</td>
        <td> Second 1 1 </td>
        <td> Second 2 1 </td>
    </tr>
    <tr>
         <td> Second 2 1 </td>
         <td> Second 2 2 </td>
    </tr>
</table>

如果我点击表格中的任何单元格,我如何计算我所在的“跨行”行?

例如,如果我点击任何“第二”单元格,我应该得到“2”,如果我点击任何“第一”单元格,我应该得到“1”。

我尝试了多种方法,包括:

row=$(this).parent().parent().children('tr').filter(function (index) {
    return $(this).children('td[rowspan]'); }).index($(this).parent());

row=$(this).parent().parent().children('tr:contains("td[rowspan]")')
    .parent().parent().index($(this).parent());

并且可以使用它

$row=$(this).parent();
while ($row.children('td:eq(0)').attr("rowspan").length<=0)
    $row=$row.prev();
span=$row.children('td:eq(0)').attr("rowspan");
row=Math.floor( parseInt($(this).parent().parent().children().index( $(this).parent()) )/span );

但这只有在有一个行跨度单元格的情况下才有效......并且假设所有行都具有相同的行跨度

我尝试在这些网站上工作,但无法走得太远。


jquery selector to count the number of visible table rows?
JQuery: How to select rows from a table
Table row and column number in jQuery

【问题讨论】:

    标签: jquery count html-table


    【解决方案1】:

    一种方法是从第一列单元格的rowspan 属性构建一个数组。从那里,您可以获取单击行的索引并遍历rowspan 数组,同时减去跨度的范围。一旦低于零,您就有了(从零开始的)索引:

    $("td").click(function() {
        var $this = $(this);
        var rowIndex = $this.closest("tr").index();
        $this.closest("table").find("tr").map(function() {
            return $(this).find("td:first").attr("rowspan") || 1;
        }).each(function(index) {
            if ((rowIndex -= this) < 0) {
                alert(index + 1);  // 'index' is zero-based.
                return false;
            }
        });
    });
    

    您可以在this fiddle 进行测试。

    【讨论】:

    • 我在小提琴上遇到的一个问题是,如果我从第一行删除了行跨度并且只有两行三个单元格,“第二个”单元格由于某种原因在点击时没有响应。 ..只有我吗?
    • @jao,你说得对,我没有正确考虑“无行跨度”的情况。现在已修复。
    • 也许只有我一个人,但是当我点击 Second 2 1 和 Second 2 2 时,我得到了“3”。
    【解决方案2】:
    var table = $('table');                     // reference of table
    $('td').click(function() {
      var perent = $(this).parent();            // find parent tr
          index= table.find(perent).index();    // get index of tr
       alert( index );
    });
    

    DEMO

    var table = $('table');
    $('td').click(function() {
        var tdWithRowSpan = $(this).siblings('td[rowspan]').length ?  // if siblings td[rowspan] exists
                                $(this).siblings('td[rowspan]') :     // get that td
                                  $(this).parent().prev('tr').find('td[rowspan]'); // else find closest td[rowspan]
    
    
        index = table.find('td[rowspan]').index(tdWithRowSpan); // get index
        alert(index);
    });
    

    DEMO

    【讨论】:

    • @jao 检查我的答案和演示,我认为它会在不更改当前HTML 的情况下解决您的问题
    • 这给了我 0->第一行,1->第二行,2->第三行,3->第四行。我需要 1-> 第 1 行、1-> 第 2 行、2-> 第 3 行、2-> 第 4 行。我想我可以将行号除以 2 和 Math.floor。
    • 如果您有超过 2 个行跨度,是否可以输入“while not rowspan go prev()”?还是会因为不存在行跨度而崩溃?
    • @jao 不会崩溃,只要给索引-1
    【解决方案3】:

    不确定这是否是您想要的;但请考虑将数据属性添加到您的标记中,让您的生活更轻松...

    <table>
        <tr data-index="0">
            <td rowspan="2">First</td>
            <td> First 1 1 </td>
            <td> First 2 1 </td>
        </tr>
        <tr data-index="1">
             <td> First 2 1 </td>
             <td> First 2 2 </td>
        </tr>
        ...
    </table>
    

    有了这个,获取价值是微不足道的:

    $(this).parent().attr("data-index");
    

    【讨论】:

    • 我知道 HTML5 是“合法的”,但这被认为是好的做法吗?我一定会让我的生活更轻松
    • @jao 当然,据我所知没问题。较旧的浏览器仍然可以检索自定义属性。据这家伙说,它甚至可以在 IE6 中运行:stackoverflow.com/questions/2412947/…
    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多