真・懒

订阅 Twitter GitHub 联系

跨浏览器使用剪贴板

一般情况下,访问或设置剪贴板,IE 只需使用 window.clipboardDatagetDatasetData 方法即可。Mozilla 家族的浏览器(如 Firefox)则比较麻烦,不仅开发者需要写一沱代码,用户也需要主动配合(就是需要设置允许访问剪贴板)才可以(参考 Using the Clipboard),以致几不可用。至于 Opera 则根本不提供剪贴板,Safari 可以在 onpaste 等非 Dom 事件中访问剪贴板(参考 Using the Pasteboard From JavaScript)。

中国特色的网站上有一个很中国特色的应用就是,在一个输入框 focus 时自动帮你把内容复制到了剪贴板中。老实说访问剪贴板是个不安全的操作,因此即使是 IE, Windows 在后来的升级中都加入是否允许访问剪贴板的提醒。如果能够做到跨浏览器的「邪恶地悄无声息」地实现中国特色的剪贴板应用,确实是个不小的挑战。

遗憾的是老外在 2006 年就帮我们做到了:使用 Flash。参考 Clipboard Copy. 原版没有考虑不安装或禁止 Flash 的情况,我做了一个小改进:

function copy(inElement) {
  var get = function (id) {
      return document.getElementById(id);
    },
    elId = "flashcopier",
    embedId = "flashembed";

  if (!get(elId)) {
    var divholder = Document.createElement("div");
    divholder.setAttribute("id", elId);
    document.body.appendChild(divholder);
  }

  var divholder = get(elId);
  divholder.innerHTML =
    '<embed src="http://static.hainei.com/swf/cp.swf"\
                    FlashVars="clipboard=' +
    encodeURIComponent(inElement.value) +
    '"\
                    width="0" height="0" type="application/x-shockwave-flash"\
                    id="' +
    embedId +
    '"></embed>';

  // 检测是否安装了 Flash
  var flashObj = window[embedId] || document[embedId] || {};
  if (!flashObj.SetVariable) {
    // 没有 flash
    try {
      return window.clipboardData.setData("Text", inElement.value);
    } catch (ex) {
      return false;
    }
  }

  return true;
}

原版是 GPL 的,这个版本也请爱咋咋用……