复选框单元格是SpreadJS(以下简称SJS)常用的一种单元格类型,常见的复选框有checkbox,radiobutton等等。
一般情况下初始化后用setCelltype方法为指定单元格设置该类型,像这样:
那么这里存在一个小问题,当快速的点击目标单元格多次,导致样式改变(不同的浏览器改变样式不同)。
当鼠标推出单元格选中状态后样式又变回来了。
这样表面上没有什么问题,只是用户体验不太好。
但是下面的场景下就会出现问题:
场景是这样的,需要做一个联动的checkbox,选中一个另外一个状态跟着变化,像这样:
当快速点击checkbox时,导致在选中过程中的点击无法被另一个单元格同步,像这样:
不仅样式会发生变化,而且逻辑也会出现问题,根本无法使用。
那么,造成这样的问题的原因是什么呢?
原因是因为自定义单元格始终是单元格,是可以被编辑的。点击过快就会是单元格进入编辑状态,这个功能在checkbox中是不需要的。
所以我们需要在单元格点击时候去判断当前sheet是不是处于编辑状态,如果处于编辑状态我们需要去结束编辑状态。
那么怎样去判断呢?
首先我们需要确定判断的时机,也就是单元格被点击时。
所以我们需要绑定ButtonClicked事件,但是buttonclicked点击其他单元格也会被触发,所以还需要进行区分
区分的方法根据业务逻辑的不同而不同,这里我是用单元格的类型进行区分判断。
spread.bind(GC.Spread.Sheets.Events.ButtonClicked,
function(e, args) {
var sheet = args.sheet,
row = args.row,
col = args.col,
cellType = sheet.getCellType(row, col);
if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBox) {
}
}
);
之后在判断中填写我们核心的逻辑,终止编辑。
if(sheet.isEditing()){
sheet.endEdit(true);
}
之后问题就解决了