表格行和列突出显示

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 $200 免费信用额度!

2009 年年中,我制作了关于表格的 屏幕广播,其中介绍了如何使用 jQuery 实现行和列突出显示。视频中的方法效率并不高,因此这是一个更新。感谢 Bronislav Klucka 向我提出这个想法。

将事件附加到表格单元格是典型的示例,也是 jQuery 事件处理历史的缩影。

  • 原始演示(版本 < jQuery 1.3) - 在每个 <td> 上使用 .hover()
  • 实时演示(jQuery 1.3 <= 版本 < jQuery 1.4.2) - 在 <td> 上使用 .live()
  • 委托演示(jQuery 1.4.2 <= 版本) - 在 <table> 上使用 .delegate()

典型表格的 HTML

假设此标记。有五列,因此有五个<colgroup>。colgroup 允许我们为整列设置样式,而无需操作单个表格单元格(因为特定列中的表格单元格没有共同的唯一父级)。

<table>
    <colgroup></colgroup>
    <colgroup></colgroup>
    <colgroup></colgroup>
    <colgroup></colgroup>
    <colgroup></colgroup>
	<thead>
	    <tr>
	        <th></th>
	        <th></th>
	        <th></th>
	        <th></th>
	        <th></th>
	    </tr>
	</thead>
	<tbody>
    		<tr>
    			<td></td>
    			<td></td>
    			<td></td>
    			<td></td>
    			<td></td>
    		</tr>
    		<tr>
    			<td></td>
    			<td></td>
    			<td></td>
    			<td></td>
    			<td></td>
    		</tr>
    		<tr>
    			<td></td>
    			<td></td>
    			<td></td>
    			<td></td>
    			<td></td>
    		</tr>
    	</tbody>
</table>

CSS

这里没什么特别的,只是我们准备使用一个类名来处理“当前”行和列的实际样式。

.hover { background-color: #eee; }

最好通过 CSS 处理实际的样式信息,而不是直接在 JavaScript 中处理。

你必须保持它们分开

– 后裔

最佳方法:委托

对于 jQuery 1.4.2+,最佳选择将是委托。以下是两秒钟的概述。您将单个事件监听器(高效!)附加到表格本身,指定哪些元素符合条件。如果表格内的任何地方被点击,它会检查该点击是否在指定的元素之一内。如果有匹配项,它会触发该函数。

$("table").delegate('td','mouseover mouseout', function(e) {
   // do stuff
});

我们的“执行操作”是在“悬停”时向行和 colgroup 应用一个类名。然而,“悬停”不是一个真正的事件,真正的事件是mouseovermouseleave。委托将接受一个用空格分隔的事件列表。在函数中,我们可以测试触发了哪种类型的事件并相应地采取行动。

$("table").delegate('td','mouseover mouseleave', function(e) {
    if (e.type == 'mouseover') {
      $(this).parent().addClass("hover");
      $("colgroup").eq($(this).index()).addClass("hover");
    }
    else {
      $(this).parent().removeClass("hover");
      $("colgroup").eq($(this).index()).removeClass("hover");
    }
});

由于委托正在监控整个表格,因此如果稍后动态添加新的表格行/单元格,它们仍然会使用此代码运行。

仍然有效的方法:Live

在 jQuery 1.3 之后,但在 jQuery 1.4.2 之前,在这种情况下处理事件的最佳方法是 .live()。还记得我们在委托中是如何监控表格本身以查找指定的事件的吗?使用 live,我们监控整个 <body> 以查找这些事件。这具有明显的优势,它允许动态添加新的行/单元格,而无需重新附加事件,但效率低于委托。

但是需要注意的是,如果将整个新表格动态添加到页面中,live 将继续工作,而委托将无法工作,因为新的表格将没有附加到它的委托。

$('td').live('mouseover', function(){
    var i = $(this).prevAll('td').length;
    $(this).parent().addClass('hover')
    $($cols[i]).addClass('hover');

}).live('mouseout', function(){
    var i = $(this).prevAll('td').length;
    $(this).parent().removeClass('hover');
    $($cols[i]).removeClass('hover');
});

旧的且效率低下的方法

在我们能够使用 live 或委托之前,唯一的方法是直接绑定每个表格单元格的事件。jQuery 仍然有一个帮助函数,但这仍然意味着为每个单独的单元格添加一个事件监听器(效率低下!例如,大量的浏览器内存使用量)。更不用说,如果动态添加新的表格行或单元格,它们将不会像它们的同类一样拥有任何附加的事件。

$("td").hover(function() {
   // do stuff
}, function() {
   // do stuff
});

如果你想看看所有旧的讨厌的东西,它就在这里

演示和下载

  • 原始演示(版本 < jQuery 1.3) - 在每个 <td> 上使用 .hover()
  • 实时演示(jQuery 1.3 <= 版本 < jQuery 1.4.2) - 在 <td> 上使用 .live()
  • 委托演示(jQuery 1.4.2 <= 版本) - 在 <table> 上使用 .delegate()

下载文件

表格更复杂吗?

有 colspan 和 rowspan 等等?Gajus Kuizinas 的 Wholly 项目 可能可以帮助您在这种情况下进行突出显示。