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列所示吗?你想在索引之前“几乎不合并”单元格吗?是的,基本上就是这个想法。