在上一篇強化程式範例複製功能裡,其實迴避了一個問題: 使用者真正想要的操作是點一下就搞定呀! "點一下->Ctrl-A->Ctrl-C"的操作步驟肯定會被嫌棄。不過,據我先前的了解,存取剪貼簿的Javascript存在跨瀏覽器的問題,除了IE內建支援外,其他瀏覽器等靠另嵌Flash物件達成,以前找到的解決方案在Flash Player 10改變剪貼篿存取政策後就壞了,我也一直發懶沒去找替代方案。無法解決IE以外瀏覽器的複製功能,獨厚IE必會引發民怨,為了公平起見,索性就不加自動複製功能了。(謎之聲: 真的是因為這樣嗎? 懶鬼!)

琛哥說,出來混,遲早是要還的。

果不其然,貼文不到幾小時,自以為天衣無縫的裝死行徑立刻被眼尖網友識破,只好乖乖出來誠實面對。

爬了一下文,很幸運地找到了一個Frefox的解決方案,不需引用額外的Flash,只要調整Firefox的signed.applets.codebase_principal_support安全設定即可支援。
(警告: 啟用該選項會增加資安風險,但就我的理解,它所開放的範圍限於經電子簽章簽署過的元件,應無重大漏洞。但各位仍應依自己的資安原則,斟酌是否使用。)

我已在網站加上複製文字的功能。在IE裡可以直接服用,Firefox則需要透過以下的步驟調整設定,至於其他瀏覽器,我則悍然決定繼續裝死。(如果有人知道解決方案,歡迎提供)

在Firefox網址列輸入”about:config”,會先出現警告訊息。(題外話,這個警告訊息的用字深得我心呀!)

在篩選條件輸入signed就可以馬上找到該選項,將值由false改成true。

如此,在Firefox也可以享受直接打包帶走的服務囉!

以下是我偷學到的剪貼簿複製函數,順手貼出來供有興趣研究的熱血青年參考:

//Copy to clipboard: ref http://forum.moztw.org/viewtopic.php?p=131407
function copyToClipboard(txt) {
    var copied = false;
     if(window.clipboardData) {
        window.clipboardData.clearData();
        window.clipboardData.setData("Text", txt);
        copied = true;
     } else if (window.netscape) {
        try {
           netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
        } catch (e) {
           alert("被瀏覽器拒絕!\n請在瀏覽器網址列輸入'about:config'\n,將'signed.applets.codebase_principal_support'設為'true'");
        }
        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);
        copied = true;
     }
     if (copied) alert('文字內容已複製到剪貼簿中!');
     else alert("使用的瀏覽器不支援文字複製功能!");
}    

Comments

# by evakey

偷偷跟你說… 我點了「複製文字」後選擇「不允許」,它就跟我說「文字內容已複製到剪貼簿中」,之後就一直說這句話,不再問我了(另開分頁就正常,IE7)

# by Holy

http://www.watch-life.net/javascript/copy-to-clipboard-solution.html 最後面有提到如何"破解" Flash Player 10 無法複製的方法,支援 Fx、IE、Opera、Chrome、Safari。

# by HELLO

請問一下,有辨法把上面那段加入在Greasemonkey裡嗎,例如幫網頁裡的某個input增加"點擊他就會複製input裡的內容"嗎??謝謝

# by player

Copy來用了 原來Flash的Copy法被改掉了, 難怪我試了好幾天試不出來 與MediaWiki整合 寫在 http://www.player.idv.tw/prog/index.php/MediaWiki:Common.js

# by Fatherch

小弟不才,可否請大大寫一個讀取剪貼簿的Function呢?困擾我很久了,感謝阿~~

# by kk

copy = function (object) { if (injectedScript._type(object) === "node") object = object.outerHTML; InjectedScriptHost.copyText(object); } 目前只試過以下版本瀏覽器是可行的,IE 沒辦法 FireFox 12.0 Chrome 19.0.1084.56

Post a comment