怎么样?
$([your selector]).attr('colspan',3);
我认为这样做是可行的,但目前没有测试的方法。使用.attr()
通常是jQuery设置包装集合中元素属性的方式。
正如其他答案中提到的那样,为了使其工作,需要从DOM中删除没有文本的元素。也许在服务器端处理会更容易。
编辑:
如评论中所述,在IE中尝试使用attr()设置colspan存在错误,但以下代码适用于IE6和Firefox 3.0.13。
演示已经可以运行
注意使用属性colSpan
而不是colspan
——前者在IE和Firefox中都能够工作,而后者在IE中无法工作。查看jQuery 1.3.2源代码,似乎attr()
会尝试将属性设置为元素的属性(colSpan
在IE和Firefox上的<td>
HTMLElements上存在作为属性并默认为1),如果:
- 它作为元素的属性存在(
colSpan
在<td>
HTMLElements上存在且默认为1);
- 此文档不是XML;
- 该属性不是href、src或style中的任一项。
使用colSpan
而不是colspan
可以在attr()
中工作,因为前者是元素上定义的属性,而后者则不是。
attr()
的后续操作是尝试在相关元素上使用setAttribute()
将值设置为字符串,但这会导致IE出现问题(jQuery中的错误#1070)。
// convert the value to a string (all browsers do this but IE) see #1070
elem.setAttribute( name, "" + value );
在示例中,对于每一行,评估每个单元格中的文本。如果文本是空字符串,则删除该单元格并增加计数器。第一行中未具有
class = "colTime"
的单元格将拥有 colspan 属性设置为计数器值+1(用于跨越其本身所占据的跨度)。
在此之后,对于每一行,
class="colspans"
单元格中的文本将被设置为从左到右在该行中每个单元格的 colspan 属性值。
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<title>Sandbox</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<style type="text/css" media="screen">
body { background-color: #000; font: 16px Helvetica, Arial; color: #fff; }
td { text-align: center; }
</style>
</head>
<body>
<table class="tblSimpleAgenda" cellpadding="5" cellspacing="0">
<tbody>
<tr>
<th align="left">Time</th>
<th align="left">Room 1</th>
<th align="left">Room 2</th>
<th align="left">Room 3</th>
<th align="left">Colspans (L -> R)</th>
</tr>
<tr valign="top">
<td class="colTime">09:00 – 10:00</td>
<td class="col1"></td>
<td class="col2">Meeting 2</td>
<td class="col3"></td>
<td class="colspans">holder</td>
</tr>
<tr valign="top">
<td class="colTime">10:00 – 10:45</td>
<td class="col1">Meeting 1</td>
<td class="col2">Meeting 2</td>
<td class="col3">Meeting 3</td>
<td class="colspans">holder</td>
</tr>
<tr valign="top">
<td class="colTime">11:00 – 11:45</td>
<td class="col1">Meeting 1</td>
<td class="col2">Meeting 2</td>
<td class="col3">Meeting 3</td>
<td class="colspans">holder</td>
</tr>
<tr valign="top">
<td class="colTime">11:00 – 11:45</td>
<td class="col1">Meeting 1</td>
<td class="col2">Meeting 2</td>
<td class="col3"></td>
<td class="colspans">holder</td>
</tr>
</tbody>
</table>
</body>
</html>
jQuery 代码
$(function() {
$('table.tblSimpleAgenda tr').each(function() {
var tr = this;
var counter = 0;
$('td', tr).each(function(index, value) {
var td = $(this);
if (td.text() == "") {
counter++;
td.remove();
}
});
if (counter !== 0) {
$('td:not(.colTime):first', tr)
.attr('colSpan', '' + parseInt(counter + 1,10) + '');
}
});
$('td.colspans').each(function(){
var td = $(this);
var colspans = [];
td.siblings().each(function() {
colspans.push(($(this).attr('colSpan')) == null ? 1 : $(this).attr('colSpan'));
});
td.text(colspans.join(','));
});
});
这只是一个演示,展示了可以使用attr()
,但需要注意它的实现以及与之相关的跨浏览器问题。我在演示中还对您的表格布局做了一些假设(即将colspan应用于每行中第一个“非时间”单元格),但希望您能明白我的意图。
colSpan
和colspan
让我免于死亡似的;-) - Topher Fangiotd.parent('tr').children('td').not(td)
可以简化为td.siblings()
。 - ErikE