找回密码
 立即注册

QQ登录

只需一步,快速开始

KevinChen 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2020-3-26 18:34  /   查看:2738  /  回复:0
熟悉SpreadJS粘贴事件的小伙伴应该知道,ClipboardPasting事件可以在粘贴操作执行前,执行一些行为,并且可以决定本次粘贴操作是否能够执行下去(cancel参数)。

但实际上,针对用户从外部Excel文档中复制了带样式的数据时,
如果仔细分析过SpreadJS的粘贴机制就会发现,在触发ClipboardPasting前,
SpreadJS已经经历过“整理粘贴内容”这一操作了。

SpreadJS会在触发ClipboardPasting事件前,针对剪切板中的格式字符串(xml格式)进行获取和整理,
那么有没有办法在这步操作前,就加入我们自己的代码逻辑,来判断究竟是否允许用户执行本次操作、
以及记录log等步骤呢?

我们知道,SpreadJS把用户的操作都封装成了command,paste也不例外,
粘贴外部数据时情况比较特殊,所以不能直接通过调用paste命令的方式来执行,
但我们可以通过传递参数的方式,在自定义命令中以这样的方式来激活这个命令:

  1. options.cmd = "paste";
  2.                                         spread.commandManager().execute(options);
  3.                                         options.cmd = "myPaste";
复制代码


不过,想在这里加loading效果的小伙伴需要注意了,首先以上代码的执行是有窗口期的,
外部信息走系统剪贴板,浏览器会给js暴露一个窗口期,
在这个窗口期间可以获取到外部的剪贴板数据,如果过了窗口期,就无法拿到外部剪贴板数据,
这就是为什么不能把这段命令放到setTimeout中。


另外,不同的浏览器,对DOM渲染的机制有区别,
在chrome中,当改变DOM状态后,浏览器还不会立即渲染DOM,而是会有一个延迟,
这个延迟是由浏览器控制的,代码无法控制,只能用setTimeout作让步操作。

在Chrome中这个问题逻辑上有冲突,是limitation场景,暂时无解。
经测试,在FireFox、IE中是可以的(Edge用了chrome内核,行为与chrome一致)


完整的示例代码请参考附件。

重写paste命令实现加入loading效果.zip

5.91 KB, 下载次数: 28

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部