【发布时间】:2010-11-26 20:17:26
【问题描述】:
我正在尝试编写一个函数,以根据作为表格顶部行之一的引用为表格添加颜色。 SO中有几个问题提到了基于行的迭代,但没有太多关于列的问题。
表格的结构类似于:
<table id="data">
<tr>
<th rowspan="2">Name</th>
<th rowspan="2">Selection</th>
<th rowspan="2">Title</th>
<th rowspan="2">Info1</th>
<th rowspan="2">Info2</th>
<th colspan="10">Data</th>
</tr>
<tr>
<th>001</th>
<th>002</th>
<th>003</th>
<th>004</th>
<th>005</th>
<th>006</th>
<th>007</th>
<th>008</th>
<th>009</th>
<th>010</th>
</tr>
<tr id="ref_control">
<td></td>
<td>RefName</td>
<td></td>
<td></td>
<td></td>
<td>A</td>
<td>B</td>
<td>J</td>
<td>L</td>
<td>Z</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
<tr>
<td><input type="checkbox" name="checkbox"/></td>
<td>Entity 1</td>
<td>Info...</td>
<td>More info...</td>
<td>Even more...</td>
<td>A</td>
<td>T</td>
<td>M</td>
<td>L</td>
<td>Z</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>2</td>
<td>5</td>
</tr>
(...)
</table>
此外,我正在使用 JQuery 和 JQuery column cell select plugin 来执行上述任务。
Javascript 代码如下所示:
$(document).ready(function() {
// Colorize table based on matches
// Number of Data entries - Count on the reference (2nd row)
// and only 5th column onwards (index starts at 0)
var datasize = $("#data tr:eq(2) td:gt(4)").length;
// Start with column 6 (index starts at 1)
var begin = 6;
for (var i = begin; i < begin + datasize; ++i) {
var curCol = $("#data td").nthCol(i);
var ref = curCol.eq(0).text();
curCol.not(curCol.eq(0)).each(function() {
var data = $(this);
if (data.text() == '') {
data.addClass("black");
} else if (data.text() != ref) {
data.addClass("color");
}
});
}
});
一个工作示例可以可视化here。在示例中,该表只有 9 行和 10 个数据列。我尝试优化的实际页面有 20 行和 90 个数据列。
使用提到的 Javascript 扩展/插件,大表不会对 Google Chrome 浏览器造成威胁,加载需要几秒钟,但是 Opera、Firefox 和 Internet Explorer 很难运行该功能或最终要求用户交互停止脚本运行。
所以我的问题是针对column select plugin 的替代方案或优化代码的方法,以便我不会杀死除 Google Chrome 之外的几乎所有浏览器。
编辑:根据@Pointy的两个cmets进行更改
【问题讨论】:
-
别忘了在
for循环中用var声明“i”!!!! -
另外,像这样设置“类”并不是一个好主意——使用
addClass()和removeClass()。 -
@Pointy .attr() 使用旨在替换所有可归因于元素的类。这不是一个“坏主意”,因为它是 JQuery 文档中推荐的方法。
-
如果我们变得挑剔,请使用 .length 而不是 .size!
-
@Unode 好吧,如果那是你真正想要的。你也可以在 DOM 上设置原始的“className”属性。就我个人而言,我希望有类似
.toggleClass()的东西让我为true案例提供一个类,为false提供一个不同的类...
标签: javascript jquery optimization jquery-plugins