在子元素事件触发的表格单元格中添加/删除类

时间:2011-07-28 08:18:55

标签: javascript jquery jquery-selectors

我正在使用jQuery 1.4。每次选中<td>内的单选按钮时,我都会尝试突出显示表的"<td>"标记,如果没有选中,则删除突出显示类。

这是标记:

CSS: .highlight-blue {background-color:#81BEF7; }

<table id="tblContainer">

        <tr>
            <td>
                <input type="radio" name="book" value="book1" /> Book 1</td>
            <td>
                <input type="radio" name="book" value="book2" /> Book 2</td>
            <td>
                <input type="radio" name="book" value="book3" /> Book 3</td>
                            <td>
                <input type="radio" name="book" value="book4" /> Book 4</td>
     </tr>
</table>

使用Javascript:

// highlight checked radion button
            $('#tblContainer :radio').click(function() {

            //add class to hilghlight selected radio button
            var cell = $(this).closest('td');
                if ($(this).is(':checked')) {
                    cell.addClass('highlight-blue');
                }
                else {
                //remove highlight class
                    cell.removeClass('highlight-blue');
                }

            });

问题是它不会从之前选择的单选按钮中删除该类。

更新1:在此处查看新的更新加价http://jsbin.com/egusud/7

4 个答案:

答案 0 :(得分:5)

是的,你想要达到行级别(如果单选按钮只是在行中相互关联)或表级别(如果它们在行之间彼此相关)。

假设只在行(live example)内:

$('#tblContainer :radio').click(function() {
    var $this = $(this);

    // Remove highlight
    $this.closest("tr").find("td.highlight-blue").removeClass("highlight-blue");

    // Add it to this one
    $this.closest("td").addClass("highlight-blue");
});

请注意,只有单击一个单选按钮才能选中它,因此无需检查。


偏离主题:如果您添加label s(live copy),那么这些单选按钮会让人们更容易点击:

<label><input type="radio" name="book" value="book1"> Book 1</label>

如果是这样,您可能希望将此CSS样式添加到标签(live copy):

label {
    cursor: pointer;
}

...更明显的是可以点击它们。


更新:在评论中,您的单选按钮显示在彼此不同的行中,并且您还混合了其他单选按钮,如下所示:

<table id="tblContainer">
  <thead>
    <tr>
      <th>Books</th>
      <th>Magazines</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>
        <label><input type="radio" name="book" value="book1"> Book 1</label>
      </td>
      <td>
        <label><input type="radio" name="magazine" value="magazine1"> Magazine 1</label>
      </td>
    </tr>
    <tr>
      <td>
        <label><input type="radio" name="book" value="book2"> Book 2</label>
      </td>
      <td>
        <label><input type="radio" name="magazine" value="magazine2"> Magazine 2</label>
      </td>
    </tr>
    <tr>
      <td>
        <label><input type="radio" name="book" value="book3"> Book 3</label>
      </td>
      <td>
        <label><input type="radio" name="magazine" value="magazine3"> Magazine 3</label>
      </td>
    </tr>
  </tbody>
</table> 

在这种情况下,要从旧的类中删除类,您只需找到具有相同名称的其他单选按钮,然后查找具有该类(live copy)的父单元格:

jQuery(function($) {

  $('#tblContainer :radio').click(function() {
    var $this = $(this);

    // Remove highlight from cells containing
    // radio buttons with this same name
    $this
      .closest("table")
      .find('input:radio[name="' + this.name + '"]')
      .closest("td.highlight-blue")
      .removeClass("highlight-blue");

    // Add it to this one
    $this.closest("td").addClass("highlight-blue");
  });

});

或者,“标记类”方法(这里我使用“rb-”加上单选按钮的名称,但你要确保单选按钮名称对类名有效)({{3 }}):

jQuery(function($) {

  $('#tblContainer :radio').click(function() {
    var $this = $(this);

    // Remove previous highlight if any
    $("td.highlight-blue.rb-" + this.name).removeClass("highlight-blue");

    // Add it to this one
    $this.closest("td").addClass("highlight-blue rb-" + this.name);
  });

});

答案 1 :(得分:1)

$("#tbl_ClientSites > tbody > tr").live("click", function() {
        var trInstance = $('#tbl_ClientSites > tbody').find('tr');                   
                trInstance.removeClass('highlighted');
                trInstance.find('tr:eq(0)').removeClass('highlighted');
                var instance = $(this);
                instance.addClass('highlighted');
                instance.find('tr:eq(0)').addClass('highlighted');      
    });

删除之前选中的突出显示的行。当前点击的行突出显示。

答案 2 :(得分:0)

$('#tblContainer :radio').click(function() {
//remove highlight from all
$('#tblContainer td').removeClass('highlight-blue')
            //add class to hilghlight selected radio button
            var cell = $(this).closest('td');


                    cell.toggleClass('highlight-blue');


            });

答案 3 :(得分:-1)

如果要从先前选择的单选按钮中删除该类,则必须遍历所有单选按钮并删除该类,但$(this)除外。或者您可以使用ID而不是类,然后只需从之前选择的ID中删除ID,然后将其添加到新ID中。