粘贴操作执行前加入自定义逻辑
熟悉SpreadJS粘贴事件的小伙伴应该知道,ClipboardPasting事件可以在粘贴操作执行前,执行一些行为,并且可以决定本次粘贴操作是否能够执行下去(cancel参数)。但实际上,针对用户从外部Excel文档中复制了带样式的数据时,
如果仔细分析过SpreadJS的粘贴机制就会发现,在触发ClipboardPasting前,
SpreadJS已经经历过“整理粘贴内容”这一操作了。
SpreadJS会在触发ClipboardPasting事件前,针对剪切板中的格式字符串(xml格式)进行获取和整理,
那么有没有办法在这步操作前,就加入我们自己的代码逻辑,来判断究竟是否允许用户执行本次操作、
以及记录log等步骤呢?
我们知道,SpreadJS把用户的操作都封装成了command,paste也不例外,
粘贴外部数据时情况比较特殊,所以不能直接通过调用paste命令的方式来执行,
但我们可以通过传递参数的方式,在自定义命令中以这样的方式来激活这个命令:
options.cmd = "paste";
spread.commandManager().execute(options);
options.cmd = "myPaste";
不过,想在这里加loading效果的小伙伴需要注意了,首先以上代码的执行是有窗口期的,
外部信息走系统剪贴板,浏览器会给js暴露一个窗口期,
在这个窗口期间可以获取到外部的剪贴板数据,如果过了窗口期,就无法拿到外部剪贴板数据,
这就是为什么不能把这段命令放到setTimeout中。
另外,不同的浏览器,对DOM渲染的机制有区别,
在chrome中,当改变DOM状态后,浏览器还不会立即渲染DOM,而是会有一个延迟,
这个延迟是由浏览器控制的,代码无法控制,只能用setTimeout作让步操作。
在Chrome中这个问题逻辑上有冲突,是limitation场景,暂时无解。
经测试,在FireFox、IE中是可以的(Edge用了chrome内核,行为与chrome一致)
完整的示例代码请参考附件。
页:
[1]