问题描述

IE 支持使用 window.clipboardData 对象内的一系列方法访问系统剪贴板;
Chrome 和 Safari 中存在类似的 Clipboard 对象,且有与 IE 中类似的方法,但其功能尚未实现;
Firefox 和 Opera 不支持这类对象。

造成的影响

若作者在需要访问剪贴板时仅仅考虑 IE 浏览器而使用了其专有的 clipboardData 对象,则在其他浏览器中可能导致功能无效且代码报错。

受影响的浏览器

非 IE 浏览器  

问题分析

现代操作系统中均提供了系统剪贴板(clipboard),它允许用户在不同的运行中的应用程序之间传递不同类型的数据。如:复制、粘贴等等。剪贴板已经成为最常用的一种不同进程间交换数据的方式。

有时候页面作者在 HTML 页面中也希望可以通过某种方式能否有权访问系统剪贴板,但处于安全的考虑,不是所有浏览器都提供实现访问剪贴板的接口。
如以下代码:

<script> window.clipboardData.setData("Text", "Hello");</script>

上面的代码只有在 IE 中可以将“hello”这个字符串复制到操作系统的剪贴板中,“Text”表明作为文本,在其他浏览器中则产生如下报错:

Firefox window.clipboardData is undefined
Chrome Uncaught TypeError: Cannot call method 'setData' of undefined
Safari TypeError: Result of expression 'window.clipboardData' [undefined] is not an object.
Opera Statement on line 2: Cannot convert undefined or null to Object stacktrace

出现此错误是因为 window.clipboardData 为 IE 专有,其他浏览器均没有此对象。更多关于 clipboardData 对象,参见 MSDN:clipboardData Object。

在 IE7 及更高版本的 IE 浏览器中,默认情况下会出现访问剪贴板的提示,通过浏览器菜单“工具 -> internet 选项 -> 安全 -> 自定义级别” 步骤可以设置剪贴板访问提示。

下表列出了其他非 IE 的主流浏览器对访问剪贴板的支持情况:

Chrome Safari Clipboard 对象
虽能看到存在此接口,但其内的方法并未实现其功能,所以在 JavaScript 中无法调用。
Opera 无操作剪贴板的对象。
Firefox Firefox 中由于对用户权限设置较高,需要修改 Firefox 的配置文件以允许浏览器支持剪贴板操作。较通用的做法是:

try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");} catch (e) { alert("被浏览器拒绝!\n请在浏览器地址栏输入'about:config'并回车\n然后将 'signed.applets.codebase_principal_support'设置为'true'");}

在访问剪贴板上,首先修改 Firefox 的配置文件,若无法修改,则通知用户自行进入管理界面修改配置文件参数。然后才有权限对剪贴板进行操作。

var clip = Components.classes['@mozilla.org/widget/clipboard;1'] .createInstance(Components.interfaces.nsIClipboard);if (!clip) return;var trans = Components.classes['@mozilla.org/widget/transferable;1'] .createInstance(Components.interfaces.nsITransferable);if (!trans) return;trans.addDataFlavor('text/unicode');var str = new Object();var len = new Object();var str = Components.classes["@mozilla.org/supports-string;1"] .createInstance(Components.interfaces.nsISupportsString);var copytext = txt;str.data = copytext;trans.setTransferData("text/unicode",str,copytext.length*2);var clipid = Components.interfaces.nsIClipboard;if (!clip) return false;clip.setData(trans,null,clipid.kGlobalClipboard);alert(" 复制成功!")

解决方案

  • 判断浏览器类型,若不是 IE 则弹出提示,告诉用户当前浏览器不能访问剪贴板。如:

    if (navigator.userAgent.indexOf("MSIE") == -1){ alert("您的浏览器不支持此功能,请手工复制文本框中内容"); return false;}
  • 如果必须要实现跨浏览器的剪贴板访问,可考虑调使用 Flash 与 JS 通信方式来解决。如:
    Zero Clipboard

【转载】js访问系统剪贴板相关推荐

  1. python中如何实现复制粘贴_引子,Python中PyQt5实现复制粘贴,程序界面如何访问系统剪贴板...

    前面内容,我们介绍了PyQt5中一些基本控件及常用的绘图设备类 Python中PyQt5如何打印图像界面,基本控件应用,QPrinter类详解 Python用PyQt5制作窗体状态栏,基本控件QSta ...

  2. java 监控剪切板_Java监视系统剪贴板

    为工作方便写了个小工具,需要监视系统剪贴板,如果文本内容变化,则自动处理并存入剪贴板. FlavorListener仅在剪贴板中的数据类型变化时才生效. 改用ClipboardOwner接口,将它注册 ...

  3. node mysql 模块化_Node.js 模块系统

    Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node. ...

  4. tmux系统剪切板_实践中的tmux:与系统剪贴板集成

    tmux系统剪切板 by Alexey Samoshkin 通过阿列克谢·萨莫什金(Alexey Samoshkin) 在实践中使用tmux:与系统剪贴板集成 (tmux in practice: i ...

  5. vim复制内容到系统剪贴板

    vim提供了y键盘操作用于复制文本,但是复制之后的文本位于当前窗口的缓冲区中,不在系统剪贴板中,这给跨程序文本拷贝代码很来很多麻烦.搜索发现,可以使用]y指令快速将选定的文本复制到系统剪贴板中. 顺便 ...

  6. C# 利用系统剪贴板 保存 自定义对象

    要使用系统剪贴板,就用到Clipboard这个类.一般而言,它只保存指定的格式的对象(在DataFormats里有枚举). 但是如果要保存自己定义的类对象呢? 没错,对象序列化是一种很好的方式. 代码 ...

  7. vim使用系统剪贴板

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/JAZZSOLDIER/article ...

  8. 使用 Vim 寄存器(registers)和系统剪贴板(clipboard)

    常见文本编辑器都会提供剪切板来支持复制粘贴,Vim也不例外. 不同的是Vim提供了10类共48个寄存器,提供无与伦比的寄存功能. 最常用的y操作将会拷贝到默认的匿名寄存器中,我们也可以指定具体拷贝到哪 ...

  9. SpringMVC 静态资源CSS,JS访问不了 解决方法

    SpringMVC 静态资源CSS,JS访问不了 解决方法 参考文章: (1)SpringMVC 静态资源CSS,JS访问不了 解决方法 (2)https://www.cnblogs.com/peiy ...

最新文章

  1. MyBatis基于注解的使用
  2. 使用Varnish加速Web
  3. java 动态代理深度学习(Proxy,InvocationHandler)
  4. 云中的机器学习:FPGA 上的深度神经网络
  5. [BZOJ 3629][JLOI2014]聪明的燕姿
  6. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...
  7. 《天天数学》连载05:一月五日
  8. OpenShift Security (11) - 用RHACS在DevOps的CICD中扫描部署中的安全风险
  9. spring boot 集成 Oracle Access Manager(OAM)单点登录
  10. Reachability的用法 判断用户的网络状态
  11. snackbar_Android Snackbar示例教程
  12. 国考地市级各题型分值分布(数量关系10题,其他题型同省级试题相同,共130题)——仅供参考
  13. IT项目失败的常见原因分析
  14. 1.42 财务测量指标——静态评价法(投资回报率+投资回收期)
  15. gatk过滤_详解GATK突变硬过滤 | 群体遗传专题
  16. vue-cli脚手架中使用talkingData埋点的方法
  17. 个别网站打不开,但是别人能打开,手机能打开
  18. (附源码)SSM学科竞赛赛场安排系统JAVA计算机毕业设计项目
  19. 新一代最强开源UI自动化测试神器 Playwright - 元素定位
  20. install pecl php_pecl安装以前的php版本

热门文章

  1. linker -l的使用
  2. android inker和Exe加载 : linker_main函数解释
  3. spring boot高校机房自动排课系统 毕业设计-附源码211004
  4. php c:windowstemp,HTML_获取Windows / System / Temp 目录路径,在我们启动电脑的同时,我们 - phpStudy...
  5. 软件测试新人,教你如何安稳度过试用期?成功入行经验分享
  6. mysql v_为什么mysql -v命令可以直接进入数据库?
  7. 小程序或者for循序要不要加key?
  8. 我回来了,hoho~~~~
  9. Starry Night Pro Plus 8 Mac下载「天文模拟软件」
  10. 刘剑 卓越领导力_卓越和令人难忘的网站设计,源于创造力