【问题标题】:change color table row if button clicked如果单击按钮,则更改颜色表行
【发布时间】:2019-04-18 04:24:22
【问题描述】:

我想在单击按钮时更改表格行的颜色。但我的代码有问题。当我点击按钮时,表格行的颜色不会改变。

CSS

tr.highlighted td {
    background: red;
}

HTML

<table id="data" border="1" cellspacing="1" width="500">
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
    </tr>
</table>
<button type="button" id="change">
Change
</button>

JQuery

$('#data tr').click(function(e) {
        $('#change').click(function() {
        $('#data tr').removeClass('highlighted');
        $(this).addClass('highlighted');
    })
});

【问题讨论】:

  • 您是否希望行单击时突出显示。或者你想先点击 row 然后点击 btn 来高亮它?
  • 因为这里的答案是为以后的场景准备的
  • 我想先单击行,然后单击 btn 以突出显示行。感谢您的回复。

标签: javascript jquery


【解决方案1】:

更新

Demo 2Demo 3 添加。其中一个演示的行为与 OP 希望评论的一样。

  • 演示 2:点击选择&lt;tr&gt;,然后点击按钮突出显示。

  • Demo 3:Demo 2相同,但一次只能突出显示一行。


在文档对象上委托点击事件。任何对文档(基本上是整个页面)的点击都会被检测到——这当然是不可取的。

`$(document).on("click',...`

委派什么对点击做出实际反应,什么没有,是称为事件委派的编程模式的目标。 jQuery 在任何事件方法签名中提供了一个可选的第二个参数,称为data 对象。这个参数基本上是一个选择器字符串,指定$(this)的范围:

`$(document).on("click', '#data td, #change', ...

因此,上面的示例将点击事件专门委托给#data 内的任何&lt;td&gt; OR #change。忽略委托元素以外的任何地方的点击(除非有另一个点击事件处理程序)。最后一个参数是当&lt;td&gt;#data#change 上的任何&lt;td&gt; 上的点击事件触发时将调用的回调函数。回调函数使用$(this) 和流控制来委托点击事件并确定行为(或结果)。在演示中,基本上是.toggleClass() 方法.addClass() 定位&lt;tr&gt;(s) 没有.highlighted 类,反之.removeClass() 定位已经有&lt;tr&gt;(s) 类的&lt;tr&gt;(s)

演示中评论了更多细节。

直接点击任意&lt;td&gt;,其父&lt;tr&gt;.highlighted被切换。

单击该按钮,所有&lt;tr&gt; 上的所有.highlighted 类都会切换。

演示1

单击&lt;tr&gt; 或按钮以突出显示&lt;tr&gt;

/*
Delegate click event on document -- 
Consider clicks only on #data td or #change
*/
/*
if the clicked tag is a <td>...
get the .closest <tr> from that <td> and add .highlighted 
class if it doesn't have it otherwise remove .highlighted
*/
/*
...otherwise get all <tr> and toggle the .highlighted class
*/
$(document).on('click', '#data td, #change', function(e) {
  if ($(this).is('td')) {
    $(this).closest('tr').toggleClass('highlighted');
  } else {
    $('#data tr').toggleClass('highlighted');
  }
});
tr.highlighted td {
  background: red;
}
<table id="data" border="1" cellspacing="1" width="500">
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<button type="button" id="change">
Change
</button>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

演示2

单击&lt;tr&gt; 选择/取消选择,然后单击按钮突出显示所有选定的&lt;tr&gt;

$(document).on('click', '#data td, #change', function(e) {
  if ($(this).is('td')) {
    $(this).closest('tr').toggleClass('selected');
  } else {
    $('#data tr:not(.selected)').removeClass('highlighted');
    $('#data tr.selected').addClass('highlighted');
  }
});
tr.highlighted td {
  background: red;
}
<table id="data" border="1" cellspacing="1" width="500">
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<button type="button" id="change">
Change
</button>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

演示3

最后一次点击的&lt;tr&gt;被选中,然后在点击按钮时高亮显示

$(document).on('click', '#data td, #change', function(e) {
  if ($(this).is('td')) {
    $('#data tr').removeClass('selected');
    $(this).closest('tr').addClass('selected');
  } else {
    $('#data tr').removeClass('highlighted');
    $('.selected').addClass('highlighted');
  }
});
tr.highlighted td {
  background: red;
}
<table id="data" border="1" cellspacing="1" width="500">
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<button type="button" id="change">
Change
</button>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

  • 不客气,@AlulR 如果此答案解决了问题,请不要忘记单击复选标记接受它。✅
  • 如果我想选择1作为最大值但不点击按钮确认,我该怎么做?
  • 互斥,例如一组单选按钮的行为方式——一次只能选择一个?
【解决方案2】:

你可以这样做:

const $dataTr = $('#data tr');
const $change = $('#change');
let $toBeChanged = null;

$dataTr.click(function() {
  $toBeChanged = $(this);
  $change.prop('disabled', false);
});

$change.click(function() {
  $dataTr.removeClass('highlighted');
  $toBeChanged.addClass('highlighted');
})
tr.highlighted td {
  background: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">
</script>
<table id="data" border="1" cellspacing="1" width="500">
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<button type="button" id="change" disabled>
Change
</button>

【讨论】:

    【解决方案3】:

    $(this).addClass('highlighted'); 中的this 指的是按钮,而不是表格行,因为this 将设置为触发回调函数执行的事件引发的任何内容,在这种情况下,具有 id 的元素change。解决此问题的最简单方法之一是在执行$('#change').click(function() {...}) 之前将this 分配给另一个变量。

    否则,如果您想确保一次只更改一个表格行,您应该将('#data tr').click(function(e) {...})$('#change').click(function() {...}) 分开,这样它们就不会嵌套,在两者之外都有一个变量来跟踪最后点击了哪一行,并在引发 $('#change').click() 时读取该变量(而不是在注册回调时捕获点击了哪个表行)。

    【讨论】:

      【解决方案4】:

      你可以使用jquery的indexeq方法。删除嵌套的click。首先单击表row 使用index 获取表中行的索引。值从0 开始。将此值设置为变量。然后单击按钮使用eq 获取表格行并向其添加类

      let getRowIndex;
      let elem = $('#data tr');
      elem.click(function(e) {
        getRowIndex = $(this).index()
      });
      
      $('#change').click(function() {
        if (getRowIndex !== undefined) {
          elem.removeClass('highlighted');
          elem.eq(getRowIndex).addClass('highlighted');
        }
      })
      tr.highlighted td {
        background: red;
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <table id="data" border="1" cellspacing="1" width="500">
        <tr>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
        <tr>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
        <tr>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
        <tr>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
      </table>
      <button type="button" id="change">
          Change
          </button>

      【讨论】:

        【解决方案5】:

        嵌套的click 处理程序在这里没有意义。相反,您可以添加一个特定的类,我们将其称为 active 到最后点击的 row 以跟踪它。之后,当您单击change 按钮时,您可以先从每个row 中删除highlighted 类,然后将其添加到拥有active 类的row 中:

        $('#data tr').click(function(e)
        {
            $('#data tr').removeClass('active');
            $(this).addClass('active');
        });
        
        $('#change').click(function()
        {
            $('#data tr').removeClass('highlighted');
            $("tr.active").addClass('highlighted');
        });
        tr.highlighted td {
          background: red;
        }
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <table id="data" border="1" cellspacing="1" width="500">
          <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
          </tr>
        </table>
        
        <button type="button" id="change">Change</button>

        【讨论】:

        • @AlulR 不客气。有时间时,请考虑选择一个已接受的答案。此外,当您获得足够的声誉时,您可以对有用的答案进行投票。
        【解决方案6】:

        $(document).ready(function(){
        $('#data tr').click(function(e) {
        			if($(this).attr("class") == 'highlighted'){
              	$(this).removeClass('highlighted');
              }else{
              	$(this).addClass('highlighted');
              }
        });
        })
        tr.highlighted td {
            background: red;
        }
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js"></script>
        <table id="data" border="1" cellspacing="1" width="500">
            <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        <button type="button" id="change">
        Change
        </button>

        【讨论】:

          【解决方案7】:

          您将click 事件附加到表tr's,然后在回调函数中将单击事件附加到button。在按钮click 回调中,您的$(this) 将引用您的按钮而不是单击tr。而是将类添加到单击的tr 本身。

          $('#data tr').click(function(e) {
              $('#data tr').removeClass('highlighted');
              $(this).addClass('highlighted');
          });
          .highlighted {
              background: red;
          }
          <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
          <table id="data" border="1" cellspacing="1" width="500">
          <tr>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
          </tr>
          <tr>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
          </tr>
          <tr>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
          </tr>
          <tr>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
              <td>&nbsp;</td>
          </tr>
          </table>
          <button type="button" id="change">Change</button>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-11-10
            • 2012-12-06
            • 2021-07-07
            • 2018-02-08
            • 1970-01-01
            • 1970-01-01
            • 2021-07-21
            相关资源
            最近更新 更多