欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用JS实现复制内容到剪切板,兼容PC和手机端,支持SAFARI浏览器的方法

程序员文章站 2022-06-29 14:29:32
javascript原生有一些事件:copy、paste、cut, 这些事件可以作用的目标元素:   能获得焦点的元素 (如contenteditable内容能编辑或者可以选中的元素),或者是<...

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

这些事件可以作用的目标元素:

  能获得焦点的元素 (如contenteditable内容能编辑或者可以选中的元素),或者是<body>

<p id="cardlist">

  <p class="btn">点击我,复制我</p>

</p>

<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>-->

<p style="margin:2em">

  <textarea id="id_text"></textarea>

  <button type="button" id="id_copy"

    data-clipboard-target="#id_text"

    data-clipboard-action="copy">点击复制

  </button>

</p>

<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="https://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