Jquery 为受“影响”的行检索列索引的最有效方法是什么;行span";?

Jquery 为受“影响”的行检索列索引的最有效方法是什么;行span";?,jquery,algorithm,html-table,traversal,Jquery,Algorithm,Html Table,Traversal,考虑下表: <table> <thead> <tr> <th scope="col" /> <th scope="col">A</th> <th scope="col">B</th> <th scope="col">C</th> </tr

考虑下表:

<table>
    <thead>
        <tr>
            <th scope="col" />
            <th scope="col">A</th>
            <th scope="col">B</th>
            <th scope="col">C</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th scope="row">1</th>
            <td>Apples</td>
            <td>Oranges</td>
            <td>Pears</td>
        </tr>
        <tr>
            <th scope="row">2</th>
            <td rowspan="2">Subcategory Heading</td>
            <td>ASP.Net</td>
            <td>Other</td>
        </tr>
        <tr>
            <th scope="row">3</th>
            <td>MVC</td>
            <td>PHP</td>
        </tr>
        <tr>
            <th scope="row">4</th>
            <td>Red</td>
            <td>Green</td>
            <td>Blue</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <td colspan="4">Some pointless footer content</td>
        </tr>
    </tfoot>
</table>

A.
B
C
1.
苹果
橘子
梨
2.
子类别标题
ASP.Net
其他
3.
MVC
PHP
4.
红色
绿色
蓝色
一些无意义的页脚内容
如何使用jQuery检索包含文本“MVC”或“PHP”的单元格的正确列号?正确答案应该是第3列,但仅使用
.prevAll().length
将只计算前面单元格的数量,在这种情况下,这将无法准确反映它们的实际列位置

我肯定我需要使用
each()
,但我也在寻找最有效的实现。

类似的东西


A.
B
C
1.
苹果
橘子
梨
2.
子类别标题
ASP.Net
其他
3.
MVC
PHP
4.
红色
绿色
蓝色
一些无意义的页脚内容

var table=$('table#foo');
table.find('td[rowspan],th[rowspan]')。每个(函数(){
塞尔纳姆变种,
参考=此,
columnNum=$(this.attr('rowspan'),
parentTr=$(this).closest('tr'),
parentTrs=$(this).closest('tr').parent().find('tr');
parentr.find('>td,>th')。每个(函数(i,o){
if(this==引用){
cellNum=i;
var计数器=columnNum;
而(计数器--){
$(this).closest('tr').next().find('>td,>th').each(函数(i,o){
if(cellNum==i){
$(this.addClass('rowspan-impacted');
$(this.attr('colNum',columnNum);
}
});
}
}
});
/*测试
window.num=num;
window.parentTr=parentTr;
window.parentTrs=parentTrs;
*/
});
嗯,最短(过度)的简化是:

var theCell = $('td:contains("MVC")');
col = theCell.parent().children().index(theCell);
row = theCell.parent().parent().children().index(theCell.parent());
注意,返回的索引是基于零的。基本上,首先要找到感兴趣的单元格。对于该列,您可以在DOM中向上移动一个级别到
,获取所有子级(在本例中,这些子级将是
的后代和
的子级),并找到该集合中感兴趣的元素的位置。对于行,在本例中,您可以爬到
,获取所有行,并找到感兴趣的
行的位置

正如您所想象的,表结构的更改会改变可能的结果。但是,如果以后以相同的方式以编程方式使用索引,则可以返回同一单元格。我之所以提出这个问题,是因为如果你在UI中以某种方式直观地使用索引,你可能会变得更加棘手,并考虑跨度,
与否


不知道这是否比梅德尔的答案更有效。但是,它肯定更易于维护!:)

我认为最接近缩短搜索步骤的方法是:

var counter = 0;
$("#idTable tbody tr").each(function(){

   var html = $(this).html();
   var php = html.indexOf("PHP") > -1 ? true : false;
   var mvc = html.indexOf("MVC") > -1 ? true : false;

   if(php || mvc) {
       $(this).find("td").each(function(){ counter += (($(this).html()=="PHP") || ($(this).html()=="MVC")) ? 1 : 0; });
   }

});

我最近为同样的问题写了一个解决方案:


这可能是另一个解决方案,供人们搜索。

试试这样的方法,你就明白了。它是有效的,为什么不:)

。填充{
显示:无;
}

1.
2.
3.
4.
1.
4.
var tb=document.querySelector('table');
tb.rows[0]。单元格[3]。innerHTML//4.
tb.rows[1]。单元格[3]。innerHTML//4.

向on致敬。

您是否正在生成表格?在本例中不是。为了便于讨论,让我们假设它是一个固定的HTML表。表结构是否固定?例如,会有不同的跨度吗?是的。固定桌子尺寸;固定表内容。只是想找出一种可靠的方法来获取单元格在表中的位置。你是在寻找我没有的东西吗?确保有足够的行,否则while循环可能是无止境的。另一个注意事项-我依赖0作为第一个(而不是1),只是因为它对我来说不是数学:)啊,但如果前一行的单元格跨越多行,这种方法不会考虑单元格的绝对位置。相反,您将获得单元格相对于跨组的索引(如果有意义的话)。换句话说,这不会返回正确的列号,只返回单元格在该行中的显示顺序。因此,由于缺乏更好的术语,您希望使用“可视”索引吗?因此,即使“MVC”单元格是第二行(实际上是第三行,因为您的prevAll()也将包括
单元格),您希望它如第3列所示吗?你想在索引之前“几乎不合并”单元格吗?是的,基本上就是这个想法。