【发布时间】:2017-07-28 00:08:42
【问题描述】:
我的最终目标是当用户按右时自动将一列添加到handsontable,光标位于最右边的列中,如果用户向左移动时最右边的列为空,则删除最右边的列;行也一样。
下面是我几乎可以工作的代码,但有一个问题:如果我不使用Handsontable.Dom.stopImmediatePropagation(event),则向上按会删除底部列并且将选择向上移动一列(这是意料之中的)行为);但如果我使用.stopImmediatePropagation,向上按会将我带到右侧单元格(并删除最下面的一行),但也会导致页面滚动。 .stopImmediatePropagation 不应该也禁止传播到页面吗?这是一个错误吗?我应该使用其他方法吗?
这是fiddle。到目前为止,我的代码看起来像
Handsontable.hooks.add('beforeKeyDown',function(event)
{
var $right = 39, $down = 40, $left = 37, $up = 38,
selected = this.getSelected(),
isEditMode = this.getActiveEditor().isOpened();
if(isEditMode) return;
// calc dimensions
var endColNum = selected ? (selected[3]+1) : null,
colsNum = this.countCols(),
isLastCol = endColNum == colsNum,
endRowNum = selected ? (selected[2]+1) : null,
rowsNum = this.countRows(),
isLastRow = endRowNum == rowsNum,
i, noData, data = this.getData();
// handle arrow keys
if(isLastCol) {
if(event.which == $right)
this.alter('insert_col');
if(event.which == $left) {
noData = true;
for(i = 0; i < rowsNum; i++)
if(data[i][endColNum-1]) // check cells content
noData = false;
if(noData) {
this.alter('remove_col');
Handsontable.Dom.stopImmediatePropagation(event);
}
}
}
if(isLastRow) {
if(event.which == $down)
this.alter('insert_row');
if(event.which == $up) {
noData = true;
for(i = 0; i < colsNum; i++)
if(data[endRowNum-1][i]) // check cells content
noData = false;
if(noData) {
this.alter('remove_row');
Handsontable.Dom.stopImmediatePropagation(event);
}
}
}
},myHandsontable);
【问题讨论】: