1. 程式人生 > >js實現復制內容到剪切板,兼容pc和手機端,支持Safari瀏覽器

js實現復制內容到剪切板,兼容pc和手機端,支持Safari瀏覽器

阻止 sele doc length rev 鍵盤 編輯狀態 nts pconnect

Javascript原生有一些事件:copy、paste、cut,

這些事件可以作用的目標元素:

  能獲得焦點的元素 (如contentEditable內容能編輯或者可以選中的元素),或者是<body>

<div id="cardList">
  <div class="btn">點擊我,復制我</div>
</div>
        
<script type="text/javascript">
            
  function copy(str){
    var save = function (e){
      e.clipboardData.setData(
text/plain,str);//下面會說到clipboardData對象       e.preventDefault();//阻止默認行為     }     document.addEventListener(copy,save);     document.execCommand("copy");//使文檔處於可編輯狀態,否則無效   }   document.getElementById(cardList).addEventListener(click,function(ev){     copy(ev.target.innerText)   })
</script>

使用jQuery中的方法監聽用戶的剪切、復制、粘貼的行為:

$("#cut").on("cut",function(){
   alert("剪切");
});
$("#copy").on("copy",function(){
   alert("復制");
});
$("#paste").on("paste",function(){
   alert("粘貼");
});

這些行為包括使用鍵盤的ctrl + c操作,或者右擊鼠標—>復制等操作。

Evevt.clipboardData 對象

clipboardData是JavaScript剪切板對象,該對象提供了3個常用方法:

  clearData(): clipboardData對象從剪切板刪除一種或多種數據格式(一個參數:數據類型)

  getData(): clipboardData對象從剪切板獲取指定格式的數據(一個參數:數據類型)

  setData(): clipboardData對象賦予指定格式的數據(兩個參數:數據類型,要賦予的值)

  *數據類型一般為“"text/plain" ”

Evevt.clipboardData 對象兼容性問題

經過嘗試,clipboardData對象內兼容大部分px瀏覽器,像chrome,firefox、ie等,但是在手機端兼容性不是很好,

  目前clipboardData在ios上的safari瀏覽器無效,為解決移動端這個問題,我們引用一個js插件——clipboard.js

  clipboard.js依賴於HTML5推出的Selection API和execCommand API

使用方法:

  首先在頁面中引入

<script src="clipboard.min.js"></script>

  使用clipboard.js的自定義屬性

<!--使用data-clipboard-target屬性指定被復制的標簽-->
<!--使用data-clipboard-action屬性指定一些操作,copy(復制),cut(剪切)-->
<!--註意:cut 操作僅適用於<textarea>和<input>-->
<div style="margin:2em">
  <textarea id="id_text"></textarea>
  <button type="button" id="id_copy"
    data-clipboard-target="#id_text"
    data-clipboard-action="copy">點擊復制
  </button>
</div>
<script type="text/javascript">
 var clipboard = new Clipboard("#id_copy");
 clipboard.on("success",function (element) {//復制成功的回調
   console.info("復制成功,復制內容: " + element.text);
 });
 clipboard.on("error",function (element) {//復制失敗的回調
   console.info(element);
 });
</script>

  高級用法:

//清理Clipboard對象
var clipboard = new Clipboard(‘.btn‘);
clipboard.destroy();

JS實現各種復制到剪貼板:

1、實現點擊按鈕,復制文本框中的的內容

<script type="text/javascript">
function copyyel2()
{
var yel2=document.getElementById("biao1");
yel2.select(); // 選擇對象
document.execCommand("Copy"); // 執行瀏覽器復制命令
alert("已復制好,可貼粘。");
}
</script>
<textarea cols="20" rows="10" id="biao1">用戶定義的代碼區域</textarea>
<input type="button" onClick="copyyel2()" value="點擊復制代碼" />

2、復制專題地址和 url 地址,傳給 QQ/MSN 上的好友

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Js復制代碼</title>
</head>
<body>
<p>
<input type="button" name="anniu1" onClick=‘copyToClipBoard()‘ value="復制專題地址和url地址,傳給QQ/MSN上的好友">
<script language="javascript">
function copyToClipBoard(){
var clipBoardContent="";
clipBoardContent+=document.title;
clipBoardContent+="";
clipBoardContent+=this.location.href;
window.clipboardData.setData("Text",clipBoardContent);
alert("復制成功,請粘貼到你的QQ/MSN上推薦給你的好友");
}
</script>

3、直接復制 url

<input type="button" name="anniu2" onClick=‘copyUrl()‘ value="復制URL地址">
<script language="javascript">
function copyUrl()
{
var clipBoardContent=this.location.href;
window.clipboardData.setData("Text",clipBoardContent);
alert("復制成功!");
}
</script>

4、點擊文本框時,復制文本框裏面的內容

<input onclick="oCopy(this)" value="你好.要copy的內容!">
<script language="javascript">
function oCopy(obj){
obj.select();
js=obj.createTextRange();
js.execCommand("Copy")
alert("復制成功!");
}
</script>

5、復制文本框或者隱藏域中的內容

<script language="javascript">
function CopyUrl(target){
target.value=myimg.value;
target.select();
js=myimg.createTextRange();
js.execCommand("Copy");
alert("復制成功!");
}
function AddImg(target){
target.value="[IMG]"+myimg.value+"[/ img]";
target.select();
js=target.createTextRange();
js.execCommand("Copy");
alert("復制成功!");
}
</script>

6.復制 span 標記中的內容

<script type="text/javascript">
</script>
<br />
<br />
<script type="text/javascript">function copyText(obj)
{
var rng = document.body.createTextRange();
rng.moveToElementText(obj);
rng.scrollIntoView();
rng.select();
rng.execCommand("Copy");
rng.collapse(false);
alert("復制成功!");
}
</script>

7.瀏覽器兼容 copyToClipboard("拷貝內容")

function copyToClipboard(txt) {
      if (window.clipboardData) {
        window.clipboardData.clearData();
        clipboardData.setData("Text", txt);
        alert("復制成功!");
  
      } else if (navigator.userAgent.indexOf("Opera") != -1) {
        window.location = txt;
      } 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);
        alert("復制成功!");
      }
    }

8.兼容各大瀏覽器的復制代碼(結合ZeroClipboard.js)

<html>
<head>
<title>Zero Clipboard Test</title>
<script type="text/javascript" src="ZeroClipboard.js"></script>
<script language="JavaScript">
 var clip = null;
 function $(id) { return document.getElementById(id); }
 function init() {
     clip = new ZeroClipboard.Client();
     clip.setHandCursor(true);    
     clip.addEventListener(mouseOver, function (client) {
  // update the text on mouse over
  clip.setText( $(fe_text).value );
     });
      
     clip.addEventListener(complete, function (client, text) {
  //debugstr("Copied text to clipboard: " + text );
  alert("該地址已經復制,你可以使用Ctrl+V 粘貼。");
     });
     clip.glue(clip_button, clip_container );
 }
</script>
</head>
<body onLoad="init()">
<input id="fe_text" cols=50 rows=5 value=復制內容文本1 >
<span id="clip_container"><span id="clip_button"><b>復制</b></span></span>
</body>
</html

js實現復制內容到剪切板,兼容pc和手機端,支持Safari瀏覽器