Clipboard API and events

Posted by huangqing on September 25, 2020

IE

IE浏览器支持直接读写剪切板内容:

window.clipboardData.clearData();  
window.clipboardData.setData('Text', 'abcd');
window.clipboardData.getData('Text');

但是这种方式不安全,很容易泄露用户的隐私,所以现在浏览器如chrome都不支持这种方式了。

1.IE下,直接支持一个window.clipboardData对象,通过这个对象可以访问到粘贴板中内容。

2.chrome和firefox,在oncopy/onpaste/oncut事件对象event中有一个clipboardData对象,而在IE的事件中是没有这个对象的

Chrome

copy

// Overwrite what is being copied to the clipboard.
document.addEventListener('copy', function(e) {
  // e.clipboardData is initially empty, but we can set it to the
  // data that we want copied onto the clipboard.
  e.clipboardData.setData('text/plain', 'Hello, world!');
  e.clipboardData.setData('text/html', '<b>Hello, world!</b>');

  // This is necessary to prevent the current document selection from
  // being written to the clipboard.
  e.preventDefault();
});

cut

// Overwrite what is copied to the clipboard.
document.addEventListener('cut', function(e) {
  // e.clipboardData is initially empty, but we can set it to the
  // data that we want copied onto the clipboard as part of the cut.
  // Write the data that we want copied onto the clipboard.
  e.clipboardData.setData('text/plain', 'Hello, world!');
  e.clipboardData.setData('text/html', '<b>Hello, world!</b>');

  // Since we will be canceling the cut operation, we need to manually
  // update the document to remove the currently selected text.
  deleteCurrentDocumentSelection();

  // This is necessary to prevent the document selection from being
  // written to the clipboard.
  e.preventDefault();
});

paste

// Overwrite what is being pasted onto the clipboard.
document.addEventListener('paste', function(e) {
  // e.clipboardData contains the data that is about to be pasted.
  if (e.clipboardData.types.indexOf('text/html') > -1) {
    var oldData = e.clipboardData.getData('text/html');
    var newData = '<b>Ha Ha!</b> ' + oldData;

    // Since we are canceling the paste operation, we need to manually
    // paste the data into the document.
    pasteClipboardData(newData);

    // This is necessary to prevent the default paste action.
    e.preventDefault();
  }
});

To trigger

execCommand('cut' / 'copy' / 'paste')

clipboardData.types

Mandatory data types

  • text/plain
  • text/uri-list
  • text/csv
  • text/css
  • text/html
  • application/xhtml+xml
  • image/png
  • image/jpg, image/jpeg
  • image/gif
  • image/svg+xml
  • application/xml, text/xml
  • application/javascript
  • application/json
  • application/octet-stream

Asynchronous Clipboard API

read()

const items = await navigator.clipboard.read();
const textBlob = await items[0].getType("text/plain");
const text = await (new Response(textBlob)).text();

readText()

navigator.clipboard.readText().then(function(data) {
  console.log("Your string: ", data);
});

write(data)

var data = [new ClipboardItem({ "text/plain": new Blob(["Text data"], { type: "text/plain" }) })];
navigator.clipboard.write(data).then(function() {
  console.log("Copied to clipboard successfully!");
}, function() {
  console.error("Unable to write to clipboard. :-(");
});

writeText(data)

await navigator.clipboard.writeText("Howdy, partner!");

常见用法

1:禁止复制

<script>
    // 网页禁止复制 body oncopy事件中 设置 return false;
    // oncopy、onpase事件: 复制、粘贴事件,可用于多数控件
    // div 没有oncopy事件,  body 与 文本框有这个事件
    function forbidCopy() {
        window.alert("网页的内容,只能看,不能动!");
        return false;
    }
</script>
<body  oncopy="forbidCopy();" >
    输入密码:
    <input type="text" oncopy="window.alert('禁止复制!');return false;" />
    再输入一边密码:
    <input type="text" onpaste="window.alert('禁止粘贴!');return false;" />
</body>

2:点击复制指定标记中的内容

<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("复制成功!"); 
    } 
    function oCopy(id){
        var obj=document.getElementById(id);
        obj.select();
        js=obj.createTextRange();
        js.execCommand("Copy");
        alert("代码已经被成功复制!");
    }
</script>


<span id="tbid">http://pmp.www.jb51.net</span>   
<a href="#" onclick="copyText(document.all.tbid)">点击复制</a>
<span id="tbid2">http://www.www.jb51.net/pmp</span>   
<a href="#" onclick="oCopy(tbid2)">点击复制</a>

3:复制内容后附加信息

<script>
    function SetCopyContent() {
        window.event.returnValue = false;
        var content = window.clipboardData.getData("Text") + "/r/n";
        content += "本资源来自简书 " + this.location.href;
        window.clipboardData.setData('Text', content);
        alert("复制成功,请粘贴到你的QQ/MSN上推荐给你的好友");
    }
</script>
<body  oncopy="SetCopyContent();" >
</body>

参考