1. 程式人生 > >js實現複製到剪貼簿功能,相容所有瀏覽器

js實現複製到剪貼簿功能,相容所有瀏覽器

前段時間做專案的時候,有點選按鈕複製文字的需求,想使用操作windows剪下板實現,在網上查了些資料,發現目前好像只有IE支援直接訪問剪下板,實現需求的時候也只做了IE中的點選複製功能,其餘瀏覽器:

if(window.clipboardData){
window.clipboardData.setData("text" , textvalue);
}else{
//提示非IE瀏覽器不支援該操作程式碼
}
上面的實現方式確實很敷衍(需求實現了,但是沒有相容性)。雖然很多文章中介紹zeroclipboard,但是強迫症犯了,不想用……

zeroclipboard

實現原理

Zero Clipboard 利用 Flash 進行復制,之前有Clipboard Copy 解決方案,其利用的是一個隱藏的 Flash。但最新的 Flash Player 10 只允許在 Flash 上進行操作才能啟動剪貼簿。所以 Zero Clipboard 對此進行了改進,用了一個透明的 Flash ,讓其漂浮在按鈕或是其他元素之上,這樣其實點選的不是按鈕而是 Flash ,也就可以使用 Flash 的複製功能了。

實現步驟

首先下載 Zero Clipboard (點選下載),並解壓縮。將檔案:ZeroClipboard.js和 ZeroClipboard.swf ,放到專案中,下面的測試程式碼將兩個檔案放到了目錄webapp/zeroclipboard/

測試程式碼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Pragma"content="no-cache">
<metahttp-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires"content="0">
<title>Copy2Clipboard</title>
</head>
<body>
         <button id="copy_button" data-clipboard-target="copy_textarea"><b>複製到剪貼簿</b></button><br/><br/>
         <textarea id="copy_textarea" rows="20" cols="100">待複製內容</textarea>
</body>
</html>
<script type="text/javascript"src="zeroclipboard/ZeroClipboard.js"></script>
<scripttype="text/javascript">
         //定義一個新的複製物件
         varclip = new ZeroClipboard( document.getElementById("copy_button"), {
           moviePath:"zeroclipboard/ZeroClipboard.swf"//設定ZeroClipboard.swf位置
         });
 
         //複製內容到剪貼簿成功後的操作
         clip.on('complete', function(client, args) {
            alert("複製成功,複製內容為:"+args.text);
         });
</script>

程式碼解析

上面的html在瀏覽器中表現

定義的複製按鈕button:


zeroclipboard隱藏的flash


通過上面兩個圖片的對比可以看到,zeroclipboard將自己的flash隱藏在了按鈕上面。使用連線或是其他元素也可以

<a id="link_copy" href="#"  data-clipboard-target="copy_textarea">copy</a>

此時,在專案中就可以進行判斷,如果是支援window.clipboardData則使用window.clipboardData,否則載入zeroclipboard相關js程式碼和資原始檔,使用zeroclipboard完成複製文字到剪下板的功能。在這裡,IE中不使用zeroclipboard的原因有兩點,第一,IE中可以隨時使用window.clipboardData,但是IE的低版本不支援zeroclipboard;第二載入第三方js會浪費資源。即便是未來的IE不再支援直接訪問剪下板,瀏覽器的怪癖檢測仍然是可行的,但是換成瀏覽器種類檢測就不一定了,比如IE10及以下檢測window.navigator.

userAgent,會返回下面的字串:

"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3)"

判斷其中是否包含MISE,就可以知道是不是IE,但是IE11返回的userAgent是:

"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; InfoPath.3; rv:11.0) like Gecko"

那麼此時對瀏覽器種類的檢測將失敗,以至於在IE11環境下使用了zeroclipboard。所以在非常有必要的情況下再進行瀏覽器種類檢測,比如告訴使用者當前使用的瀏覽器及其版本,否則建議使用瀏覽器怪癖檢測,如if(window.clipboardData){//……}。

題外話

文章開始說到強迫症犯了,不想使用zeroclipboard實現複製文字到剪下板,是因為當時感覺應該有別的解決方法,比如:模擬鍵盤ctrl+c,或是使用js觸發文字框的剪下板事件:
	function copy(){
		var textarea=document.getElementById("myTextarea");
		var textvalue=textarea.value;
		if(window.clipboardData){
			//IE
			window.clipboardData.setData("text" , textvalue);
		}else{
			//Chrome
			console.log(document.implementation.hasFeature("keyboardEvents","3.0"));
			var event = document.createEvent("KeyboardEvents");
			event.initKeyboardEvent("keydown",true,true,window,"c",0,"Ctrl",0);
			textarea.focus();
			textarea.select();
			textarea.dispatchEvent(event);
		}//FF、 OPera未測試
	}

正當滿心欣喜時,測試失敗了,雖然沒有進行Firefox和Opera瀏覽器中的相關測試,但是僅Chrome中無法實現就已經宣告該實現方式失敗了。 理論上此時應該可以訪問剪下板,但是實際上非IE瀏覽器出於各種安全方面的考慮陸續的不再支援直接訪問剪下板,在剪下板事件中訪問也是失敗的(本地測試)。在Chrome中即便是在剪下板事件物件中使用clipboardData.getData("text")或是setData("text/plain","新的剪下板內容")也是失敗的,測試到這裡,自己的實現思路還是放棄吧,再爭扎已經沒有意義了。