如何选择与rowspan对应的行?

我有一个动态生成的表,我正在尝试更改某些行的背景颜色。有时会有行包含行,我无法弄清楚如何获取对应于一行“行”的所有行。 我已经搜索了我的大脑,发现这个jsfiddle非常接近我所需要的(在逻辑意义上)

http://jsfiddle.net/DamianS1987/G2trb/

基本上我有这样的事情:

在此处输入图像描述

我希望能够像这样一次突出显示整行:

在此处输入图像描述

但是我可以在rowspan行上实现的唯一突出显示是:

在此处输入图像描述

这是我的代码(不同于jsfiddle,但基本上是相同的逻辑)

CSS:

.highlightedClass{ background-color: #AEAF93; } 

HTML:

 

JAVASCRIPT:

 for(var j=0; j < inspection.length; j++){ var $tr = $('
'); var $td_id = $('').addClass('td_id').html(inspection.id); $tr.append($td_id); $table.append($tr); $.each(inspection[i], function(index, value){ var $td_name, $td_miles,$td_workEvent; if(index > 0){ var $2nd_tr = $(''); $td_name = $('').addClass('td_name').html(value.stationSt); $td_miles = $('').addClass('td_miles').html(value.miles); $td_workEvent = $('').addClass('td_workEvent').html(value.code); $2nd_tr.append($td_name); $2nd_tr.append($td_miles); $2nd_tr.append($td_workEvent); $table.append($2nd_tr); $td_id.attr('rowSpan',index+1); if($td_id.text() === content().id){ $2nd_tr.addClass("highlightedClass"); }else{ if($2nd_tr.hasClass("highlightedClass")){ $2nd_tr.removeClass('highlightedClass'); } } $('#workevent').on('click', function(){ $tr.removeClass('highlightedClass'); }); }else{ $td_name = $('').addClass('td_name').html(value.stationSt); $td_miles = $('').addClass('td_miles').html(value.miles); $td_workEvent = $('').addClass('td_workEvent').html(value.code); $tr.append($td_name); $tr.append($td_miles); $tr.append($td_workEvent); $table.append($tr); if($td_id.text() === content().id){ $tr.addClass("highlightedClass"); }else{ if($tr.hasClass("highlightedClass")){ $tr.removeClass('highlightedClass'); } } $('#workevent').on('click', function(){ $tr.removeClass('highlightedClass'); }); } });

您需要在所选的td查找任何rowspan=属性,如果存在,也要选择后续行。 此示例应支持任何rowspan值(它根据rowspan计数追加后续行):

最终版本:JSFiddle: http : //jsfiddle.net/TrueBlueAussie/G2trb/22/

 $('td').bind('click', function () { var $row = $(this).closest('tr'); // What row index is the clicked row? var row = $row.index(); // Subtract heading row // Does the clicked row overlap anything following? var rowspan = ~~$row.find('td[rowspan]').attr('rowspan') || 0; // Get all rows except the heading, up to the last overlapped row var $rows = $row.parent().children().slice(1, row + rowspan); row--; // Subtract the heading row we excluded // Now see if any preceding rows overlap the clicked row $rows.each(function (i) { var $tr = $(this); // Only check first rowspan of a row var rowspan = ~~$tr.find('td[rowspan]').attr('rowspan') || 0; // If the rowspan is before the clicked row but overlaps it // Or it is a row we included after the selection if ((i < row && ((rowspan + i) > row)) || i > row) { $row = $row.add($tr); } }); $row.toggleClass('green'); }); 

首次尝试JSFiddle: http : //jsfiddle.net/TrueBlueAussie/G2trb/18/

 $('td').bind('click', function () { var $td = $(this); var $row = $td.closest('tr'); var $tds = $row.find('td'); $tds.each(function(){ var rowspan = ~~$(this).attr('rowspan'); while (--rowspan > 0){ $row = $row.add($row.next()); } }); $row.toggleClass('green'); }); 

它需要针对位于前一行行下的子行进行调整,但我也在努力。

笔记:

  • ~~是将字符串转换为整数的快捷方式。
  • || 0 || 0将未定义的值转换为0。
  • $row = $row.add($tr)将行元素追加到jQuery集合/对象。

在解决我的问题(关闭TrueBlueAussie给我的)时,我提出了以下解决方案。

CSS:

 .highlightedClass{ background-color: #AEAF93; } 

HTML:

 
ID NAME Miles WORK
999B John 702.4 Y
111A Tom 446.5 Y
Becky 446.5 A
ID NAME Miles WORK
999B John 702.4 Y
111A Tom 446.5 Y
Becky 446.5 A

JAVASCRIPT:

 for(var j=0; j < inspection.length; j++){ var $tr = $(''); var $td_id = $('').addClass('td_id').html(inspection.id); $tr.append($td_id); $table.append($tr); $.each(inspection[i], function(index, value){ var $td_name, $td_miles,$td_workEvent; if(index > 0){ var $2nd_tr = $(''); $td_name = $('').addClass('td_name').html(value.stationSt); $td_miles = $('').addClass('td_miles').html(value.miles); $td_workEvent = $('').addClass('td_workEvent').html(value.code); $2nd_tr.append($td_name); $2nd_tr.append($td_miles); $2nd_tr.append($td_workEvent); $table.append($2nd_tr); $td_id.attr('rowSpan',index+1); if($td_id.text() === content().td_id){ $2nd_tr.addClass("highlightedClass"); }else{ if($2nd_tr.hasClass("highlightedClass")){ $2nd_tr.removeClass('highlightedClass'); } } $('#workevent').on('click', function(){ if($td_id.text() === content().td_id){ $2nd_tr.addClass("highlightedClass"); }else{ if($2nd_tr.hasClass("highlightedClass")){ $2nd_tr.removeClass("highlightedClass"); } } }); }else{ $td_name = $('').addClass('td_name').html(value.stationSt); $td_miles = $('').addClass('td_miles').html(value.miles); $td_workEvent = $('').addClass('td_workEvent').html(value.code); $tr.append($td_name); $tr.append($td_miles); $tr.append($td_workEvent); $table.append($tr); if($td_id.text() === content().id){ $tr.addClass("highlightedClass"); }else{ if($tr.hasClass("highlightedClass")){ $tr.removeClass('highlightedClass'); } } } }); 

这是一个嵌套的if语句。 下面就像三个if语句,我把它说:

  $('#workevent').on('click', function(){ var flag= false; $('#altTable > tbody > tr').each(function() { $td_id= $(this).find('.td_id'); if($td_id.text() === ''){ if(flag === true){ $(this).addClass("highlightedClass"); flag = true; } }else{ if(if($td_id.text() === content().idtd_id{){ if($(this).hasClass("highlightedClass")){ flag = true; }else{ $(this).addClass("highlightedClass"); flag = true; } }else{ flag = false; if($(this).hasClass("highlightedClass")){ $(this).removeClass("highlightedClass"); } } } }); }); 

这对我有用。 我选择了TrueBlueAussie的答案,因为它帮助我得到了我的具体答案。 希望这两个答案可以在将来帮助其他人。