我正在编写一个管理非常大的表的脚本。当用户点击表格单元格时,我想知道他们点击了哪个单元格。 e.g
--------------
| | |
| | Click|
--------------
应该给我一个(1,1)的单元格引用。
任何方式我都可以用javascript做到这一点。它运行的页面使用jquery用于其他目的,因此任何基于jquery的解决方案都是好的。
编辑:为了澄清,左上角的单元格是(0,0)。出于性能原因,事件需要绑定到表,而不是tds。
答案 0 :(得分:3)
使用target
对象的event
属性非常轻松地完成此操作:
$('#mytable').click(function(e) {
var tr = $(e.target).parent('tr');
var x = $('tr', this).index(tr);
var y = tr.children('td').index($(e.target));
alert(x + ',' + y);
});
此方法允许您仅将1个事件处理程序绑定到整个表,然后确定单击了哪个表单元格。这被称为事件委托,并且在正确的情况下可以更有效,并且这符合要求。使用此功能可以避免将事件绑定到每个<td>
,并且不需要硬编码坐标。所以,如果你的表看起来像这样:
<table id='mytable'>
<tr>
<td>hi</td>
<td>heya</td>
</tr>
<tr>
<td>boo</td>
<td>weee</td>
</tr>
</table>
它会在点击时提醒坐标。你可以做任何事情。 :)
如果您发现性能太慢(取决于您的表的大小),那么您将不得不求助于硬编码或两者的组合,可能只对<tr>
索引进行硬编码,因为获取速度最慢,然后动态获取<td>
索引。最后,如果所有这些协调业务完全没有必要,而您真正想要的是对所点击的<td>
的引用,那么您只需这样做:
$('#mytable').click(function(e) {
var td = $(e.target);
// go crazy
});
答案 1 :(得分:2)
$('td').click(function(event) {
var row = $(this).parent('tr');
var horizontal = $(this).siblings().andSelf().index(this);
var vertical = row.siblings().andSelf().index(row);
alert(horizontal+','+vertical);
});
答案 2 :(得分:1)
您应该能够通过获取对点击的TD的DOM节点的引用,然后向后走previousSibling链,直到您到达第一列,然后按照计算进行计数。
你正处于兄弟链的起点(即行中的第一个TD),parentNode应该是TR节点,并且你可以执行类似的遍历{{3用于计算行数的TR。
或者,在创建表时,向每个单元格添加一些假的 rowidx =“??”和 colidx =“??”属性,并使用{检索这些属性{3}}。如果要使用legal属性,可以将行和列索引放在previousSibling属性中。
答案 3 :(得分:0)
你提到了一个非常大的表 - 将点击绑定到每个td是不明智的。更好的方法是使用.live方法,如果仍然在jquery 1.2.6上,你可以将click事件绑定到表并使用事件委托。如果你需要这个问题的代码。
$("#tableId td").live('click', function () {
var $this = $(this);
var x = $this.prevAll().length;
var y = $this.parent().prevAll.length;
console.log(x + ", " + y);
});
答案 4 :(得分:0)
假设您的第1行,第1列为0,0
var row = 0;
$('#tblImages > tbody > tr').each( function(){
var col = 0;
$(this).children('td').each( function(){
$(this).attr("currentRow", row).attr("currentCol", col);
col++;
});
row++;
}
);
$('#tblImages > tbody > tr > td').click(function(){
alert( $(this).attr("currentRow") + " " + $(this).attr("currentCol"));
这当然可以进一步提高..但是它的工作
答案 5 :(得分:0)
window.onload = function () {
document.getElementsByTagName('table')[0].addEventListener('click', function(element) {
var rowIndex = element.target.parentElement.rowIndex;
var cellIndex = element.target.cellIndex;
document.getElementById('alert').innerHTML = ('Row index = ' + rowIndex + ', Column index = ' + cellIndex);
}, false);
}
tr, th, td {
padding: 0.6rem;
border: 1px solid black
}
table:hover {
cursor: pointer;
}
<table>
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
</tbody>
</table>
<p id="alert"></p>