2.4. Clipboard 对象

Clipboard 对象提供了四个方法,用来读写剪贴板。它们都是异步方法,返回 Promise 对象。

2.4.1. Clipboard.readText()

  • Clipboard.readText()方法用于复制剪贴板里面的文本数据。
    document.body.addEventListener(
      'click',
      async (e) => {
        const text = await navigator.clipboard.readText();
        console.log(text);
      }
    )
    
  • 上面示例中,用户点击页面后,就会输出剪贴板里面的文本。注意,浏览器这时会跳出一个对话框,询问用户是否同意脚本读取剪贴板。如果用户不同意,脚本就会报错。这时,可以使用try...catch结构,处理报错。
    async function getClipboardContents() {
      try {
        const text = await navigator.clipboard.readText();
        console.log('Pasted content: ', text);
      } catch (err) {
        console.error('Failed to read clipboard contents: ', err);
      }
    }
    

2.4.2. Clipboard.read()

  • Clipboard.read()方法用于复制剪贴板里面的数据,可以是文本数据,也可以是二进制数据(比如图片)。该方法需要用户明确给予许可。该方法返回一个 Promise 对象。一旦该对象的状态变为 resolved,就可以获得一个数组,每个数组成员都是 ClipboardItem 对象的实例。
    async function getClipboardContents() {
      try {
        const clipboardItems = await navigator.clipboard.read();
        for (const clipboardItem of clipboardItems) {
          for (const type of clipboardItem.types) {
            const blob = await clipboardItem.getType(type);
            console.log(URL.createObjectURL(blob));
          }
        }
      } catch (err) {
        console.error(err.name, err.message);
      }
    }
    
  • ClipboardItem 对象表示一个单独的剪贴项,每个剪贴项都拥有ClipboardItem.types属性和ClipboardItem.getType()方法。ClipboardItem.types属性返回一个数组,里面的成员是该剪贴项可用的 MIME 类型,比如某个剪贴项可以用 HTML 格式粘贴,也可以用纯文本格式粘贴,那么它就有两个 MIME 类型(text/htmltext/plain)。ClipboardItem.getType(type)方法用于读取剪贴项的数据,返回一个 Promise 对象。该方法接受剪贴项的 MIME 类型作为参数,返回该类型的数据,该参数是必需的,否则会报错。

2.4.3. Clipboard.writeText()

  • Clipboard.writeText()方法用于将文本内容写入剪贴板。
    document.body.addEventListener(
      'click',
      async (e) => {
        await navigator.clipboard.writeText('Yo')
      }
    )
    
  • 上面示例是用户在网页点击后,脚本向剪贴板写入文本数据。该方法不需要用户许可,但是最好也放在try...catch里面防止报错。
    async function copyPageUrl() {
      try {
        await navigator.clipboard.writeText(location.href);
        console.log('Page URL copied to clipboard');
      } catch (err) {
        console.error('Failed to copy: ', err);
      }
    }
    

2.4.4. Clipboard.write()

  • Clipboard.write()方法用于将任意数据写入剪贴板,可以是文本数据,也可以是二进制数据。该方法接受一个 ClipboardItem 实例作为参数,表示写入剪贴板的数据。
    try {
      const imgURL = 'https://dummyimage.com/300.png';
      const data = await fetch(imgURL);
      const blob = await data.blob();
      await navigator.clipboard.write([
        new ClipboardItem({
          [blob.type]: blob
        })
      ]);
      console.log('Image copied.');
    } catch (err) {
      console.error(err.name, err.message);
    }
    
  • 上面示例中,脚本向剪贴板写入了一张图片。注意,Chrome 浏览器目前只支持写入 PNG 格式的图片。ClipboardItem()是浏览器原生提供的构造函数,用来生成ClipboardItem实例,它接受一个对象作为参数,该对象的键名是数据的 MIME 类型,键值就是数据本身。下面的例子是将同一个剪贴项的多种格式的值,写入剪贴板,一种是文本数据,另一种是二进制数据,供不同的场合粘贴使用。
    function copy() {
      const image = await fetch('kitten.png');
      const text = new Blob(['Cute sleeping kitten'], {type: 'text/plain'});
      const item = new ClipboardItem({
        'text/plain': text,
        'image/png': image
      });
      await navigator.clipboard.write([item]);
    }