我认为这种方法只需要一些调整。可以在单击单元格时计算约束;随着鼠标的移动,您知道何时停止对单元格着色。
这是一个细分:
jQuery(function($) {
document.onselectstart = function () { return false; }
var $table = $('#contentPlaceHolderMain_tableAppointment'),
columns = [],
dragInfo = null;
$table.find('td').each(function() {
var i = $(this).index();
(columns[i] = columns[i] || []).push(this);
});
这将创建一个旋转数组,以便您可以更轻松地引用每一列。这稍后会派上用场。
$table.on('mouseup', function() {
// reset selection
dragInfo = null;
});
这与您之前的代码相同,除了您可能已经注意到两个不同之处:
我正在设置 click 事件处理程序$table
而不是document
; 这可以防止在收到表格外的点击时产生一些开销。
因为.live()
已弃用,.on()
应改为使用。
让我们继续讨论mousedown
处理程序。
$table.on('mousedown', 'td', function() {
var $this = $(this),
columnIndex = $this.index();
if ($this.is('.selected') || columnIndex < 2) {
return;
}
var thisRow = $this.parent().index(),
selectionRowAbove = -Infinity,
selectionRowBelow = Infinity;
$.each(columns[columnIndex], function(rowIndex) {
if ($(this).is('.selected')) {
if (rowIndex < thisRow && rowIndex > selectionRowAbove) {
selectionRowAbove = rowIndex;
} else if (rowIndex > thisRow && rowIndex < selectionRowBelow) {
selectionRowBelow = rowIndex;
}
}
});
通过添加侦听器td
而不是tr
您不必找到最近的单元格;它会为您计算。这部分函数计算出当前单元格上方和下方的红色单元格。
// unmark cells
$table.find(".csstdhighlight").removeClass("csstdhighlight");
dragInfo = {
column: columnIndex,
enclosure: {
above: selectionRowAbove,
below: selectionRowBelow
},
min: thisRow,
max: thisRow
};
$this.addClass('csstdhighlight');
});
该函数的最后一部分保存了您以后需要的所有拖动信息。
$table.on('mousemove', 'td', function() {
if (!dragInfo) {
return;
}
var $this = $(this),
columnIndex = $this.index(),
rowIndex = $this.parent().index();
if (columnIndex != dragInfo.column || rowIndex == 0 || rowIndex <= dragInfo.enclosure.above || rowIndex >= dragInfo.enclosure.below) {
dragInfo = null;
return;
}
这些条件确保选择保持在我们之前确定的范围内。
// mark cells
var cells = [columns[columnIndex][rowIndex]];
while (dragInfo.min > rowIndex) {
cells.push(columns[columnIndex][dragInfo.min--]);
}
while (dragInfo.max < rowIndex) {
cells.push(columns[columnIndex][dragInfo.max++]);
}
$(cells).addClass('csstdhighlight');
});
});
函数的最后一部分标记了选择;它通过计算上次调用之间的差异来做到这一点,这样您就不必再次标记单元格。
演示