【发布时间】:2015-11-19 15:57:27
【问题描述】:
在 Handsontable 中,当单击列标题时,会选择该列的所有单元格。有办法防止这种情况发生吗?
我认为文档中没有这样的选项。我也没有在 Handsontable 库本身的源代码中找到事件在 DOM 上的注册位置。
任何提示将不胜感激。谢谢。
【问题讨论】:
标签: handsontable
在 Handsontable 中,当单击列标题时,会选择该列的所有单元格。有办法防止这种情况发生吗?
我认为文档中没有这样的选项。我也没有在 Handsontable 库本身的源代码中找到事件在 DOM 上的注册位置。
任何提示将不胜感激。谢谢。
【问题讨论】:
标签: handsontable
我认为不可能阻止这种行为。我在文档中也没有找到任何线索,也没有快速检查源代码。
但是,您可以在选中单元格后立即取消选中它们。绑定一个函数来处理单元格点击事件就可以了。你可以通过在实例化你的handsontable时注册回调来做到这一点:
$('#my_handsontable').handsontable({
...
afterOnCellMouseDown: function(event, coords){
// 'coords.row < 0' because we only want to handle clicks on the header row
if (coords.row < 0){
$('#my_handsontable').handsontable('deselectCell');
}
},
...
});
或者通过钩子:
Handsontable.hooks.add('afterOnCellMouseDown', function(event, coords){
if (coords.row < 0){
$('#my_handsontable').handsontable('deselectCell');
}
});
或者,您可以编辑可操作的源代码并在 walkontableConfig 中添加在单击标题单元格时选择整列的代码段:
var walkontableConfig = {
...
onCellMouseDown: function (event, coords, TD, wt) {
...
// if (coords.row < 0) {
// instance.selectCell(0, coords.col, instance.countRows() - 1, coords.col);
// instance.selection.setSelectedHeaders(false, true);
// }
...
},
...
};
【讨论】:
beforeOnCellMouseDown 并在那里执行您建议的解决方案并阻止事件传播。我马上试试。
可以使用beforeOnCellMouseDown 钩子阻止事件传播,这可以防止被点击的标题列的单元格被选中:
/**
* @param {MouseEvent} event
* @param {WalkontableCellCoords} coords
* @param {Element} element
*/
var handleHotBeforeOnCellMouseDown = function(event, coords, element) {
if (coords.row < 0) {
event.stopImmediatePropagation();
}
};
Handsontable.hooks.add('beforeOnCellMouseDown',
handleHotBeforeOnCellMouseDown, handsontable);
非常感谢 Gustavo 的帮助!
【讨论】:
stopPropogation 在某些情况下可能是更好的选择(请参阅stackoverflow.com/questions/5299740/…)
是的,有一个技巧,或者我们可以说选项来防止在标题单击时选择单元格。 “只需将 selectionMode 设置为单曲即可。”
试试下面的代码:
document.addEventListener("DOMContentLoaded", function() {
var example1 = document.getElementById('example1');
var selectOption = document.getElementById('selectOption');
var settings1 = {
data: Handsontable.helper.createSpreadsheetData(10, 10),
width: 700,
height: 272,
colWidths: 75,
rowHeights: 20,
rowHeaders: true,
colHeaders: true,
selectionMode: 'single', // 'single', 'range' or 'multiple',
};
var hot1 = new Handsontable(example1, settings1);
});
【讨论】: