http://www.w3help.org/zh-cn/causes/BX2001

标准参考

问题描述

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;
    }

BX2001: IE 支持使用 window.clipboardData 访问系统剪贴板,Chrome 和 Safari 中存在类似的 Clipboard 对象但尚未实现,Firefox 和 Opera 不支持这类对象的更多相关文章

  1. (转)vim 访问系统剪贴板

    原文出处:http://vim.wikia.com/wiki/Accessing_the_system_clipboard Please review this tip: This tip was i ...

  2. 终于掌握vim的寄存器和系统剪贴板的使用了- 要安装vim-X11包

    vim的系统剪贴板 vim的 加号寄存器 "+ 是和系统剪贴板 相关联的. 加号寄存器和系统剪贴板之间的内容, 可以互相切换. 要把 加号寄存器中的内容, -> 放到/转移到系统剪贴板 ...

  3. Cherry.chen window.clipboardData实现剪切板操作总结 (好像只有ie好用)

    window.clipboardData的作用是在页面上将需要的东西复制到剪贴板上,提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用. 三个方法 (1)clearData(sDataForma ...

  4. 基于Linux的kfifo移植到STM32(支持os的互斥访问)

    基于Linux的kfifo移植到STM32(支持os的互斥访问) 关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个 ...

  5. [转载]socket下server端支持多客户端并发访问简单实现

    /*Author: wainiwann *Source: 博客园 http://www.cnblogs.com/wainiwann *Remarks:  转载请说明出处!!! */ 感觉很不错,可以学 ...

  6. js 点击复制代码 window.clipboardData.setData

    var v = document.getElementById("forcopy").value; window.clipboardData.setData('text',v); ...

  7. SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问

    SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问 https://blog.csdn.net/yft_android/article/details/80307672

  8. mui 访问系统相册将图片显示到网页

    访问系统相返回值为一个对象,通过转换为字符串可以查看,path.files[0]为返回路径去除路径赋值到src 调用摄像头返回的相片的path为一个路径通过 plus.io.resolveLocalF ...

  9. 通过window(Navicat)访问linux中的mysql数据库

    Centos安装Mysql数据库 查看我们的操作系统上是否已经安装了mysql数据库 [root@centos~]# rpm -qa | grep mysql // 这个命令就会查看该操作系统上是否已 ...

随机推荐

  1. [BZOJ4632]树的编码

    [BZOJ4632]树的编码 试题描述 SHUXK 正在对一棵N个结点的有根树进行研究,首要的一件事就是对这棵树进行编码. lz 说:“这还不容易吗?我令根节点的编号为 1,然后保证每个结点的编号都比 ...

  2. SQL注入自学[第二学:注入环境的简单突破]

    /* 原文出处:珍惜少年时 留给原创一个ZBD机会. 加号即空格 */ 00x1 判断是否含有注入 http://127.0.0.1/1.php?id=3 and 1=1-- 返回正确的页面. htt ...

  3. linux下用mii-tool和ethtool 查看网线是否正确连接到网卡

    输入mii-tool可以查看网线是否连接到网卡#mii-tool eth0: negotiated 100baseTx-FD, link ok 有时驱动可能不支持会出错下列错误#mii-tool SI ...

  4. 【Hadoop】Hive HSQ 使用 && 自定义HQL函数

    4 HQL 4.1 官网 4.1.1 https://cwiki.apache.org/confluence/display/Hive/LanguageManual 4.1.2 性能调优 4.1.2. ...

  5. python 异常类型

    1.NameError:尝试访问一个未申明的变量>>>  vNameError: name 'v' is not defined 2.ZeroDivisionError:除数为0&g ...

  6. mac os 显示文件列表命令 ls -a

    显示正常文件列表用ls就行了,但是要是想显示隐藏的文件,需要加-a

  7. 忘记oracle的sys用户密码怎么修改

    转分类: Linux 一.忘记除SYS.SYSTEM用户之外的用户的登录密码.  用SYS (或SYSTEM)用户登录: CONN SYS/PASS_WORD AS SYSDBA;  使用如下语句修改 ...

  8. Linux下的ip命令,除了ifconfig还有很多

    linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...

  9. 如何将win7安装到 移动硬盘/U盘 及 VHD、BCD等相关知识 链接汇总

    如何将win7安装到 移动硬盘/U盘? 从u盘启动win7/2008 R2的方法,更新:换机器免sysprep的方法:http://www.360doc.com/content/11/1103/14/ ...

  10. 面向服务的体系结构(SOA)——(5)关于MEP(Message Exchange Patterns)

    SOA中的MEP和JavaEE中的JMS类似,当然了就应该是类似的,因为都是关于消息方面的.一个是对系统架构当中消息的解决思路,一个是针对Java平台中的消息的具体解决办法(严格说不是具体的,只是提供 ...