zoukankan      html  css  js  c++  java
  • BX2001: IE 支持使用 window.clipboardData 访问系统剪贴板,Chrome 和 Safari 中存在类似的 Clipboard 对象但尚未实现,Firefox 和 Opera 不支持这类对象

    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 选项 -> 安全 -> 自定义级别” 步骤可以设置剪贴板访问提示。
    IE7, IE8

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

    Chrome Safari Clipboard 对象
    虽能看到存在此接口,但其内的方法并未实现其功能,所以在 JavaScript 中无法调用。
    Opera 无操作剪贴板的对象。
    Firefox Firefox 中由于对用户权限设置较高,需要修改 Firefox 的配置文件以允许浏览器支持剪贴板操作。较通用的做法是:
    try {
      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    } catch (e) {
      alert("被浏览器拒绝!
    请在浏览器地址栏输入'about:config'并回车
    然后将 '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;
      }
  • 相关阅读:
    UITextField最大字符数和最大字节数的限制
    Python profiling
    Glow Android 优化实践
    当 NSDictionary 遇见 nil
    TCP/IP详解2 学习笔记---mbuf
    行业代码获取最近代码
    词语、句子相似度比较
    从word得到表格数据插入数据库(6位行业代码)
    python遍历数组获取下标
    计算机浮点数表示
  • 原文地址:https://www.cnblogs.com/chris-oil/p/3777018.html
Copyright © 2011-2022 走看看