javascript - 如何选择与 rowspan 对应的行?

标签 javascript jquery css html-table

我有一个动态生成的表,我试图更改其中某些行的背景颜色。有时有些行带有行跨度,但我无法弄清楚如何获取与一个“行”相对应的所有行。我用谷歌搜索了我的大脑,发现这个 jsfiddle 非常接近我需要的(在逻辑意义上)

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

基本上我有这样的东西:

enter image description here

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

enter image description here

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

enter image description here

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

CSS:

.highlightedClass{
background-color: #AEAF93;
}

HTML:

<table border="1" class="altTable">
<th>ID</th>
<th>NAME</th>
<th>Miles</th>
<th>WORK</th>
<tbody>
    <tr>
        <td class="td_id">999B</td>
        <td class="td_name ">John</td>
        <td class="td_cumMiles">702.4</td>
        <td class="td_workEvent">Y</td>
    </tr><tr>
    <td class="td_id" rowspan="2">111A</td>
    <td class="td_name">Tom</td>
    <td class="td_cumMiles">446.5</td>
    <td class="td_workEvent">Y</td>
    </tr><tr>
    <td class="td_name">Becky</td>
    <td class="td_cumMiles">446.5</td>
    <td class="td_workEvent">A</td>
    </tr>
</tbody>

JavaScript:

for(var j=0; j < inspection.length; j++){
var $tr = $('<tr></tr>');
var $td_id = $('<td></td>').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 = $('<tr></tr>');

    $td_name = $('<td></td>').addClass('td_name').html(value.stationSt);
    $td_miles = $('<td></td>').addClass('td_miles').html(value.miles);
    $td_workEvent = $('<td></td>').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 = $('<td></td>').addClass('td_name').html(value.stationSt);
    $td_miles = $('<td></td>').addClass('td_miles').html(value.miles);
    $td_workEvent = $('<td></td>').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');
});

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

注意事项:

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

关于javascript - 如何选择与 rowspan 对应的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663018/

相关文章:

javascript - 复选框垂直对齐错误 : label is down and the check box is up

javascript - Jquery 根据单选按钮值(或其他方式)更改选择框值

html - URL 不适用于 SVG 图形

html - 尝试用 CSS 绘制虚线

javascript - Meteor + Bootstrap - 警报已关闭。bs.alert 未触发

javascript - parse.com Javascript CORS 更新用户名时出错(可解析端)

javascript - 如何设置 react-stripe-checkout 表单的样式?

javascript - 删除按钮而不编辑 Flash 文件

javascript - sweetalert JS 插件迁移到 Sweetalert2

jquery - 如何在 jquery 中选择多个 css 属性?