想實作,點按鈕複製區塊內文字的功能。

Fiddle.js 查看效果

PS. 在這個部落格,fiddle.js result 預覽處點按鈕並不會成功複製文字,原因:

light/:66 無法複製文本: NotAllowedError: Failed to execute ‘writeText’ on ‘Clipboard’: The Clipboard API has been blocked because of a permissions policy applied to the current document. See https://goo.gl/EuHzyv for more details.

直接進入 fiddle.js,看 demo,點按鈕可以成功複製文字。(僅複製純文字,不包括文字格式,所以貼上的時候,會是一整串文字黏在一起。)

程式碼

HTML + JS

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>複製文本示例</title>
</head>

<body>
  <div id="text">
    內容內容內容請複製這邊的內容
  </div>
  <button id="copyButton">複製文本</button>
  <script>
    function copyTextToClipboard(text) {
      if (navigator.clipboard) {
        // 使用 Clipboard API
        return navigator.clipboard.writeText(text).then(() => {
          alert('文本已複製到剪貼簿');
        }).catch(err => {
          alert('無法複製文本:', err)
          console.error('無法複製文本:', err);
        });
      }
    }
    const text = document.getElementById('text').textContent;
    // 監聽按鈕點擊事件
    document.getElementById('copyButton').addEventListener('click', () => {
      copyTextToClipboard(text);
    });
  </script>
</body>

</html>

希望貼上的文字,是包括排版格式

那麼 JS 要 改成以下寫法,且複製的文字,要貼在 word 文件才能看見效果。無法貼在記事本。

// JS
async function copyHtmlToClipboard(html) {
  if (navigator.clipboard) {
    try {
      await navigator.clipboard.write([
        new ClipboardItem({
          'text/html': new Blob([html], { type: 'text/html' })
        })
      ]);
      alert('文本已複製到剪貼簿');
    } catch (err) {
      alert('無法複製文本:' + err.message);
      console.error('無法複製文本:', err);
    }
  } else {
    alert('此瀏覽器不支持剪貼簿 API。');
  }
}

const html = document.getElementById('text').innerHTML;
// 監聽按鈕點擊事件
document.getElementById('copyButton').addEventListener('click', () => {
  copyHtmlToClipboard(html);
});

.write() 與 .writeText()

(詢問 chatgpt 後得到的回覆)

write()writeText() 是 Clipboard API 中的兩個不同方法,用於將資料寫入剪貼簿,但它們的用途和參數有所不同。以下是它們的比較和具體說明:

1. write()

  • 用途:用於將多種資料類型寫入剪貼簿,包括文本、HTML、圖像等。
  • 參數:需要一個包含 ClipboardItem 的陣列作為參數。
const htmlContent = '<strong>這是 HTML 內容</strong>';

navigator.clipboard.write([
  new ClipboardItem({
    'text/html': new Blob([htmlContent], { type: 'text/html' }),
    'text/plain': new Blob(['這是純文本'], { type: 'text/plain' })
  })
]).then(() => {
  console.log('資料已成功寫入剪貼簿');
}).catch(err => {
  console.error('無法寫入剪貼簿:', err);
});

2. writeText()

  • 用途:專門用於將純文本寫入剪貼簿,使用更簡單。
  • 參數:只需一個字符串作為參數。
const textToCopy = '這是要複製的文本';
navigator.clipboard.writeText(textToCopy).then(() => {
  console.log('文本已成功寫入剪貼簿');
}).catch(err => {
  console.error('無法寫入文本:', err);
});

總結

  • 使用 write() 方法時,可以同時寫入多種資料類型,適合需要複雜資料格式的情況。
  • 使用 writeText() 方法時,操作簡單且方便,適合只需寫入純文本的情況。

參考資料

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *