realazy


跨浏览器使用剪贴板

一般情况下,访问或设置剪贴板,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 的,这个版本也请爱咋咋用……

10 Responses to “跨浏览器使用剪贴板”

  1. Evance Says:

    这篇文章为啥子归类于web标准内?

  2. 闲耘 Says:

    一直用google reader订阅,才发现懒人也改版。

  3. 锐风 Says:

    哇, 这个东西好哦..
    很早就在找..

  4. muqiao Says:

    这也叫改进,

    有window.clipboardData的话,在插入flash对象之前就直接调用了

    还try呢,晕

  5. realazy Says:

    @muqiao

    直接使用 window.clipboardData 的话,会有恼人的安全提示,所以把它的等级次于有 Flash 的情况。另外,try 是避免没有 window.clipboardData 的浏览器出错(我觉得这比判断浏览器好)。

  6. longwosion Says:

    flash是好帮手呀,好多浏览器不能流畅实现的功能,都用它来实现了。:)

  7. omiga Says:

    迄今为止都只看到通过flash的解决办法~···

  8. 魏中华 Says:

    >>访问剪贴板是个不安全的操作!

    是非常不安全!想象一下,如果你上的每个网站都窃取了你剪贴板上的内容,日积月累,配合下搜索引擎,你想不泄漏个人隐私或者公司的机密都难。

    就冲这个因素,也应该把访问剪贴板的功能从浏览器上去掉,包括这个已经流传很久的 flash 实现。

  9. 闲耘 Says:

    Flash一直是补丁大户。
    访问剪贴板是很危险,也很有用的功能,这是一把双刃剑。
    注意安全的朋友可以在FF里装NoScript插件,它会屏蔽js脚本,flash等不安全因素,临时允许也很便捷,对于信任的网站,可以加到白名单。

    其实我觉得主动访问剪贴板是一件很讨厌的事情,最好不要自作聪明,让用户控制自己的行为。也不要屏蔽浏览器右键菜单,可以使用功能按钮或左键菜单代替。

  10. leeight的马甲 Says:

    Linux下面的Firefox试了试无效,有没有其他的办法呢?

Leave a Reply


第三届 D2 前端技术论坛 (上海)

realazy (懒到死) is proudly powered by WordPress | Entries (RSS) and Comments (RSS)