找回密码
 立即注册

QQ登录

只需一步,快速开始

yaoxiaoqiang00
中级会员   /  发表于:2017-6-22 11:54  /   查看:3744  /  回复:8
本帖最后由 yaoxiaoqiang00 于 2017-6-22 11:56 编辑

需要右键菜单实现粘贴,要达到与Ctrl+v同样效果

// 方式一(如果从excel中复制内容,然后执行右键粘贴调用此方法,粘贴不上去)
sheet.doKeyDown({
                        shiftKey: false,
                        altKey: false,
                        metaKey: false,
                        ctrlKey: true,
                        key: 'v',
                        keyCode: 86,
                        type: 'keydown',
                        which: 86
                    });

// 方式二(从你们的demo中看到的方法,也无法达到Ctrl+v一样效果)
GcSpread.Sheets.SpreadActions.paste.call(sheet);


用了以上两种方式实现,但是发现都有问题,无法达到与Ctrl+v完全一样的效果,我需要怎么实现

8 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-22 16:54:57
沙发
右键粘贴是通过JS代码来实现的,由于浏览器的限制是无法直接通过JS获取浏览器剪贴板中的内容的,所以右键菜单粘贴只能实现SPread内部的复制粘贴,无法实现粘贴从Spread外部复制的内容。如果您所说的无法达到的效果是上面说的这样,那么这样是没办法的,属于技术限制。
回复 使用道具 举报
yaoxiaoqiang00
中级会员   /  发表于:2017-6-22 17:28:19
板凳
ClarkPan 发表于 2017-6-22 16:54
右键粘贴是通过JS代码来实现的,由于浏览器的限制是无法直接通过JS获取浏览器剪贴板中的内容的,所以右键菜 ...

技术上应该没有问题吧
QQ截图20170622172920.png
从excel复制之后,js通过下边方法是可以读取到剪切板内容的window.clipboardData.getData('Text')
取到的内容:"-111111\t2.00\r\n55.00\t11.00\r\n";



回复 使用道具 举报
yaoxiaoqiang00
中级会员   /  发表于:2017-6-22 17:46:09
地板
本帖最后由 yaoxiaoqiang00 于 2017-6-22 18:03 编辑
ClarkPan 发表于 2017-6-22 16:54
右键粘贴是通过JS代码来实现的,由于浏览器的限制是无法直接通过JS获取浏览器剪贴板中的内容的,所以右键菜 ...

我重写了_SheetEventHandler原型下边的_getClipboardData方法,然后加上了从剪切板读取数据的代码,ie下可以实现从excel复制内容,spread中右键粘贴了,不过谷歌浏览器不行

GcSpread.Sheets._SheetEventHandler.prototype._getClipboardData = function () {
      var data = this._focusElem ? this._focusElem.value : "";
      // 从剪切板读取数据
      if (!data && window.clipboardData) data = window.clipboardData.getData('Text');
      return this._formatClipboardData(data)
};
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-23 09:55:21
5#
yaoxiaoqiang00 发表于 2017-6-22 17:46
我重写了_SheetEventHandler原型下边的_getClipboardData方法,然后加上了从剪切板读取数据的代码,ie下 ...

不同浏览器的机制是不一样的,IE能实现应该是微软在IE内部与window之间增加了特殊的接口,毕竟都是微软的产品,IE内部是有很多与window之间进行交互的底层代码。而其他浏览器不可能做到,也是为了安全性的考虑,比如如果js能访问您外部的剪贴板,那么试想一下,我在外部复制了银行卡号,密码等重要信息,当我在访问一个网页时,网页中的js访问了我的剪贴板,结果就获取了这些信息,是不是很可怕。
回复 使用道具 举报
yaoxiaoqiang00
中级会员   /  发表于:2017-6-23 11:27:57
6#
ClarkPan 发表于 2017-6-23 09:55
不同浏览器的机制是不一样的,IE能实现应该是微软在IE内部与window之间增加了特殊的接口,毕竟都是微软的 ...

好,那就给客户说不支持此功能了
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-23 12:12:15
7#
yaoxiaoqiang00 发表于 2017-6-23 11:27
好,那就给客户说不支持此功能了

那么,有什么问题欢迎另开新帖进行询问。
回复 使用道具 举报
lilyzhaooo
注册会员   /  发表于:2024-4-16 11:04:04
8#
Clark.Pan 发表于 2017-6-23 09:55
不同浏览器的机制是不一样的,IE能实现应该是微软在IE内部与window之间增加了特殊的接口,毕竟都是微软的 ...

为什么飞书就能做到呢?目前飞书只要获得授权之后,后边再右键粘贴就和ctrl+v的效果一样了,官方大大要么再调研一下这个问题看看?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2024-4-16 12:11:34
9#
本帖最后由 Clark.Pan 于 2024-4-16 12:12 编辑

这个问题我们之前早就做过了调研,飞书的方式确实是可行的。
但是SpreadJS是一个标准化的产品,所以设计上走的是标准的操作(符合浏览器源生行为),所以SpreadJS组件中粘贴的时候默认不是上述的特性。
因为飞书相当于重做了剪切板,所以他的复制粘贴是需要请求你这边授权的。
如果您愿意,您也可以自行去改写,毕竟产品都是前端的js代码,是完全可以深入二开的(产品源码是有可修改协议的)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部