跨瀏覽器復制神器 ZeroClipboard 2.x快速入門詳解

有些時候厢岂,我們希望讓用戶在網(wǎng)頁上完成某個操作就能自動將指定的內(nèi)容復制到用戶計算機的剪貼板中。但是出于安全原因下愈,大多數(shù)現(xiàn)代瀏覽器都未提供通用的剪貼板復制接口(或即便有毡琉,也默認被禁用)。只有IE瀏覽器可以通過如下方式來進行復制舍杜。

window.clipboardData.setData("Text", "這里是需要復制的文本內(nèi)容")
想要實現(xiàn)跨瀏覽器的復制功能新娜,我們就可以使用 ZeroClipboard。

ZeroClipboard 及其原理介紹

ZeroClipboard 是國外大神開發(fā)的一個用于剪貼板復制的 JS 插件蝴簇,它是基于 Flash 來實現(xiàn)跨瀏覽器的復制功能的杯活。當我們使用 ZeroClipboard 的時候匆帚,它會悄悄隱藏一個小小的 Flash 影片(swf)熬词,不會對我們的用戶界面造成影響。我們只需要借助它實現(xiàn)復制功能就行了吸重。ZeroClipboard 中的 "Zero" 指的就是"不可見互拾,零干擾"。

不過從 Flash 10開始嚎幸,由于瀏覽器和Flash的安全限制颜矿,要求用戶必須在Flash區(qū)域上進行真實操作才能操作剪貼板。于是嫉晶,ZeroClipboard 的作者想到一個辦法:它將 Flash 做成透明的骑疆,以便于我們放在諸如鏈接、按鈕等需要放置的任何地方替废。這樣箍铭,用戶界面看起來沒有變化,當點擊鏈接或按鈕時,實際上點擊是卻是 Flash,從而實現(xiàn)復制操作沪袭。

ZeroClipboard 快速入門

使用 ZeroClipboard 的方法非常簡單朽砰,我們只需要在頁面中引入它的一個JS文件并稍作配置(最簡單只需一行代碼)即可(實際上還需要引入一個Flash的swf文件,不過 ZeroClipboard 會自動引入它)茂嗓。

請參考下面的示例代碼:
注意:這里介紹的是目前最新版 ZeroClipboard 2.1.6 的用法,2.x 版本均可參考,但 1.x 的用法與此并不相同拍摇!ZeroClipboard 2.x 原則上不兼容IE 6 ~ IE 8等低版本IE瀏覽器,如果需要兼容IE 6 ~ IE 8馆截,請使用 1.x 或者 2.0.2 版本(詳情可以參考下方評論中的官方鏈接)充活,推薦使用 2.0.2 版本。此外,由于 Flash 本地沙箱的安全限制堪唐,以下代碼如果是在本地HTML文件中被瀏覽器直接打開巡语,將無法正常工作。

<!-- 這里是HTML代碼部分 -->
<textarea id="content" rows="10" cols="60">這里是需要復制的內(nèi)容</textarea>
<input id="copy" type="button" data-clipboard-target="content" value="復制">
<!-- 這里是JS代碼部分 -->
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/zeroclipboard/2.1.6/ZeroClipboard.min.js" ></script>
<script type="text/javascript">
// 將【復制】按鈕充當復制數(shù)據(jù)的元素載體
var clip = new ZeroClipboard( document.getElementById("copy") );</script>

以上就是引入并使用 ZeroClipboard 的最簡代碼淮菠。我們?yōu)椤緩椭啤堪粹o指定了data-clipboard-target
屬性男公,其值為將被復制數(shù)據(jù)的元素id。此時合陵,我們點擊【復制】按鈕就可以復制id為content的textarea中的文本數(shù)據(jù)枢赔。你可以點擊這里 運行代碼

ZeroClipboard 重要事項

關于文件引入和本地化使用

上面我們引入的JS文件是 ZeroClipboard 官方提供的 CDN,你可以直接使用拥知。如果你想將其下載到本地服務器上使用踏拜,你可以進入官方網(wǎng)站下載最新版本。然后將dist目錄下的ZeroClipboard.js
(或者壓縮版的ZeroClipboard.min.js)和ZeroClipboard.swf
這兩個文件上傳到自己的服務器即可低剔。
請確保它們被放在同一目錄下速梗,以便于 ZeroClipboard.js 自動加載 ZeroClipboard.swf 文件。否則你需要在使用前額外配置swf文件的路徑襟齿。

// 在 new ZeroClipboard()之前姻锁,需要先配置 ZeroClipboard.swf 文件的路徑
ZeroClipboard.config( { swfPath: 'http://YOURSERVER/path/ZeroClipboard.swf' } );

多個復制載體

如果你希望在頁面中有多個按鈕、鏈接等元素充當復制數(shù)據(jù)的載體猜欺,你可以以數(shù)組(或類數(shù)組)形式傳入多個元素位隶。以下幾種方式都是可以的:

// 方式一 (生成多個ZeroClipboard對象,適合不同載體復制不同來源的數(shù)據(jù))
var clip = new ZeroClipboard( document.getElementById("copy") );
var clip2 = new ZeroClipboard( document.getElementById("copy2") );
// 方式二 (生成一個ZeroClipboard對象开皿,適合不同載體復制相同來源的數(shù)據(jù))
var doms = [ document.getElementById("copy"), 
document.getElementById("copy2") ];
// var doms = document.getElementsByName("copy"); 
// 通過ByName或ByTagName獲取多個元素也是可以的
// var doms = $(".copy");
// 通過jQuery對象也是可以的
// 只要是通過length屬性訪問元素個數(shù)涧黄、通過數(shù)字索引來訪問DOM元素的對象都是可以的var clip = new ZeroClipboard( doms );

更改復制載體

如果之前你使用【按鈕1】來充當復制載體,現(xiàn)在你想添加【按鈕2】來充當復制載體赋荆。你可以調(diào)用 ZeroClipboard 實例的clip()
方法:

var clip = new ZeroClipboard( document.getElementById("copy") );
// 添加id為copy2的元素作為復制載體笋妥,原來id為copy的元素依然可用clip.clip( document.getElementById("copy2")
 /* 也可以數(shù)組形式傳入多個 */  );
如果你想要卸載指定的復制載體,你可以使用unclip()

方法糠睡。

// 取消id為copy2的元素上注冊的復制功能
clip.unclip( document.getElementById("copy2") /* 也可以數(shù)組形式傳入多個 */  );
// 不指定任何參數(shù)挽鞠,則取消該對象之前在所有元素上注冊的復制功能clip.clip();

設置用于復制的文本數(shù)據(jù)
如果指定了data-clipboard-target
屬性,ZeroClipboard 將依次嘗試通過該元素的value狈孔、textContent信认、innerText屬性來獲取文本數(shù)據(jù)(依次判斷是否有上述屬性,并以最靠前的屬性為準)均抽。

當然嫁赏,ZeroClipboard 也并非只能通過其他元素才能獲得用于復制的文本數(shù)據(jù),我們還可以給復制載體自身的data-clipboard-text
屬性來設置用于復制的文本數(shù)據(jù)油挥,之后你還可以通過設置該屬性值(setAttribute())來更改需要復制的文本內(nèi)容潦蝇。

<input id="copy" type="button" data-clipboard-text="這里是用于復制的內(nèi)容款熬,value="復制">

此外,我們甚至無需通過元素節(jié)點的屬性來設置用于復制的文本數(shù)據(jù)攘乒,我們可以直接使用 ZeroClipboard 對象的setText()

方法來設置文本數(shù)據(jù)贤牛。注意,該方法設置的數(shù)據(jù)是一次性的则酝,使用該方法設置復制數(shù)據(jù)后殉簸,只在下一次復制操作時生效。之后即使你點擊復制按鈕也不再執(zhí)行復制沽讹,除非你再次調(diào)用setText()

方法(你可以綁定復制("copy")事件來調(diào)用該方法般卑,從而實現(xiàn)每次復制操作都設置數(shù)據(jù),下面我們會講到)爽雄。
clip.setText("設置用于復制的文本內(nèi)容");
數(shù)據(jù)來源的優(yōu)先級問題:如果我們同時為復制載體設置了data-clipboard-text
蝠检、 data-clipboard-target
屬性,并調(diào)用了setText()
方法挚瘟,那么 ZeroClipboard 復制數(shù)據(jù)的優(yōu)先級是:setText() > data-clipboard-target > data-clipboard-text叹谁。
如果前者沒有文本數(shù)據(jù)(沒有調(diào)用、 沒有屬性或者數(shù)據(jù)為空字符串)刽沾,則以下一個優(yōu)先級為準本慕,如果都沒有文本數(shù)據(jù),則不復制侧漓。
舉例來說,如果同時設置上述三者监氢。第一次復制:先取setText()
設置的數(shù)據(jù)布蔗,如果為空字符串,則取data-clipboard-target
對應元素的數(shù)據(jù)浪腐;如果它也為空字符串纵揍,則取data-clipboard-text
屬性的文本數(shù)據(jù);如果它也為空字符串议街,則不復制泽谨。注意,由于setText()
設置的數(shù)據(jù)是一次性的特漩,下一次復制將以data-clipboard-target
屬性為準(除非再次調(diào)用setText()
方法)吧雹。

數(shù)據(jù)類型

眾所周知,剪貼板中的數(shù)據(jù)是有類型的涂身,每一種類型都可以有自己的數(shù)據(jù)雄卷。我們復制的數(shù)據(jù)可以有多種類型,當我們粘貼的時候蛤售,會粘貼當前程序可接受類型的數(shù)據(jù)丁鹉。
ZeroClipboard也支持設置多種類型的剪貼板數(shù)據(jù)妒潭。它為我們提供了setText()、setHtml揣钦、setRichText()方法分別用于設置純文本數(shù)據(jù)雳灾、HTML內(nèi)容、富文本內(nèi)容冯凹。
// 可同時設置佑女,粘貼時根據(jù)接收程序的不同,而粘貼出不同的內(nèi)容clip.setText("CodePlayer");clip.setHtml("<strong>CodePlayer</strong>");clip.setRichText("{\rtf1\ansi\n{\b CodePlayer}}");
此外谈竿,ZeroClipboard還提供了一個通用的設置方法setData()
团驱,用于設置各種類型的數(shù)據(jù)。
// 可同時設置空凸,粘貼時根據(jù)接收程序的不同嚎花,而粘貼出不同的內(nèi)容clip.setData("text/plain", "CodePlayer");clip.seData("text/html", "<strong>CodePlayer</strong>");clip.setData("application/rtf", "{\rtf1\ansi\n{\b CodePlayer}}");

事件處理

ZeroClipboard 還為我們提供了事件支持,以便于處理ZeroClipboard觸發(fā)的各種事件呀洲。ZeroClipboard支持的事件有"ready"紊选、 "beforecopy"、 "copy"道逗、 "aftercopy"兵罢、 "destroy"、 "error"滓窍。
我們可以通過on()
方法來注冊事件處理函數(shù)卖词。
// 當Flash SWF文件加載完成并準備就緒時觸發(fā)ready事件clip.on("ready", function(){ alert("加載完成!"); });// 當觸發(fā)copy事件時,設置用于復制的文本數(shù)據(jù)clip.on("copy", function(e){ e.clipboardData.setData("text/plain", "這里是用于復制的純文本數(shù)據(jù)")});
此外吏夯,off()
方法用來取消注冊的事件處理函數(shù)此蜈,emit()
方法用來手動觸發(fā)事件。其用法與jQuery的on()噪生、 off()裆赵、 trigger()方法非常相似。
此外跺嗽,如果你有多個ZeroClipboard對象战授,你想為它們都注冊事件處理函數(shù)。你可以使用全局對象ZeroClipboard的靜態(tài)方法ZeroClipboard.on()
桨嫁、 ZeroClipboard.off()
植兰、 ZeroClipboard.emit()
來全局性地設置事件。全局事件將對每個對象都生效瞧甩。
關于事件處理的詳細用法钉跷,請參考ZeroClipboard事件及其屬性細節(jié)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肚逸,一起剝皮案震驚了整個濱河市爷辙,隨后出現(xiàn)的幾起案子彬坏,更是在濱河造成了極大的恐慌,老刑警劉巖膝晾,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栓始,死亡現(xiàn)場離奇詭異,居然都是意外死亡血当,警方通過查閱死者的電腦和手機幻赚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臊旭,“玉大人落恼,你說我怎么就攤上這事±胙” “怎么了佳谦?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滋戳。 經(jīng)常有香客問我钻蔑,道長,這世上最難降的妖魔是什么奸鸯? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任咪笑,我火速辦了婚禮,結(jié)果婚禮上娄涩,老公的妹妹穿的比我還像新娘窗怒。我一直安慰自己,他們只是感情好钝满,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布兜粘。 她就那樣靜靜地躺著,像睡著了一般弯蚜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剃法,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天碎捺,我揣著相機與錄音,去河邊找鬼贷洲。 笑死收厨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的优构。 我是一名探鬼主播诵叁,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钦椭!你這毒婦竟也來了拧额?” 一聲冷哼從身側(cè)響起碑诉,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侥锦,沒想到半個月后进栽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡恭垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年快毛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片番挺。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡唠帝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玄柏,到底是詐尸還是另有隱情襟衰,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布禁荸,位于F島的核電站右蒲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赶熟。R本人自食惡果不足惜瑰妄,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望映砖。 院中可真熱鬧间坐,春花似錦、人聲如沸邑退。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽地技。三九已至蜈七,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莫矗,已是汗流浹背飒硅。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留作谚,地道東北人三娩。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像妹懒,于是被迫代替她去往敵國和親雀监。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程眨唬,因...
    小菜c閱讀 6,365評論 0 17
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,915評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理会前,服務發(fā)現(xiàn)好乐,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 一只狐貍失足掉到了很深的井里回官,不論他如何掙扎仍沒法爬上去曹宴,只好待在那里。一只羊覺得口渴極了歉提,正好來到井邊笛坦。他看見狐...
    虛懷若谷8閱讀 606評論 0 0
  • (一) 孤窗照遠影版扩, 空寂宛如煙, 我心無所依侄泽, 滿目皆悵然礁芦! (二) 一季秋風起, 細雨恁凄涼悼尾, 落英留情寄柿扣, ...
    古城蒼狼閱讀 298評論 0 6