Hỗ trợ SVG cho API Bảng nhớ tạm không đồng bộ

Giao diện Clipboard của API Bảng nhớ tạm không đồng bộ cung cấp quyền đọc và ghi vào nội dung của bảng nhớ tạm của hệ thống. Tính năng này cho phép một ứng dụng web triển khai các tính năng cắt, sao chép và dán. Bạn có thể dán dữ liệu từ bảng nhớ tạm vào một ứng dụng bằng cách gọi phương thức read() và sao chép dữ liệu vào bảng nhớ tạm bằng cách gọi phương thức write(). Ngoài văn bản, hình ảnh ở định dạng Đồ hoạ mạng di động (PNG), HTML chưa được dọn dẹpđịnh dạng tuỳ chỉnh trên web, API Bảng nhớ tạm không đồng bộ hiện cũng hỗ trợ sao chép và dán hình ảnh SVG, có nghĩa là cuối cùng bạn có thể tương tác với phần mềm chỉnh sửa hình ảnh xử lý SVG bằng cách sao chép và dán hình ảnh SVG dưới dạng hình ảnh thay vì sử dụng văn bản một cách tự nhiên.

Tính năng phát hiện khả năng hỗ trợ SVG

Phát hiện tính năng hỗ trợ hình ảnh SVG (và mọi loại MIME khác) bằng cách gọi phương thức ClipboardItem.supports() tĩnh, truyền vào phương thức đó kiểu MIME mong muốn.

const supportsSVG = () => {
  if (
    !('supports' in window.ClipboardItem) ||
    !window.ClipboardItem.supports('image/svg+xml')
  ) {
    return false;
  }
  return true;
};

Sao chép hình ảnh SVG

Sao chép hình ảnh SVG bằng cách điền một đối tượng vào ClipboardItem. Blob có dữ liệu hình ảnh SVG là giá trị và loại của blob (tức là 'image/svg+xml' trong trường hợp này) làm khoá.

copyButton.addEventListener('click', async () => {
  if (!supportsSVG()) {
    return;
  }
  try {
    const blob = await fetch(img.src).then((response) => response.blob());
    await navigator.clipboard.write([
      new window.ClipboardItem({
        [blob.type]: blob,
      }),
    ]);
  } catch (err) {
    console.error(err.name, err.message);
    alert(err.message);
  }
});

Dán hình ảnh SVG

Để dán hình ảnh SVG, hãy đọc lại ClipboardItem từ bảng nhớ tạm và lấy loại mong muốn (tức là 'image/svg+xml' trong trường hợp này) bằng phương thức getType(). Thao tác này sẽ trả về một blob mà sau khi được chuyển đổi thành URL của blob, bạn có thể gán cho thuộc tính src của <img>.

pasteButton.addEventListener('click', async () => {
  if (!supportsSVG()) {
    return;
  }
  const [clipboardItem] = await navigator.clipboard.read();
  const svgBlob = await clipboardItem.getType('image/svg+xml');
  if (!svgBlob) {
    alert('No SVG in the clipboard.');
    return;
  }
  const image = document.createElement('img');
  const blobURL = URL.createObjectURL(svgBlob);
  image.addEventListener('load', () => {
    URL.revokeObjectURL(blobURL);
  });
  image.src = blobURL;
});

Thanh lọc

SVG là một định dạng mạnh mẽ cho phép các tập lệnh nhúng. Điều này có thể gây nguy hiểm khi người dùng dán nội dung từ các nguồn không xác định, vì vậy, trình duyệt sẽ chạy bước dọn dẹp. Khi dữ liệu được sao chép, API Bảng nhớ tạm không đồng bộ sẽ tạo ra tài liệu SVG có định dạng phù hợp rồi ghi tài liệu đó vào bảng nhớ tạm. Khi bạn dán dữ liệu, trình phân tích cú pháp mảnh sẽ tạo ra một mảnh SVG được xử lý nghiêm ngặt. Do đó, trước thao tác dán, thuộc tính trình xử lý sự kiện onclick vẫn còn đó nhưng khi bạn dán, các thuộc tính này sẽ bị xoá.

Ứng dụng Trình xem bảng nhớ tạm trên macOS kiểm tra nội dung trong bảng nhớ tạm. Nó cho thấy
các thuộc tính trình nghe sự kiện nhấp trong SVG vẫn ở đó.
Ứng dụng Trình xem ván trượt trên macOS kiểm tra nội dung trong bảng nhớ tạm. Nó cho thấy các thuộc tính trình nghe sự kiện nhấp trong SVG vẫn ở đó.

Bản minh hoạ

Khám phá cách sao chép và dán SVG trong bản minh hoạ trên Glitch. Hãy xem mã nguồn để biết cách hoạt động. Hãy chắc chắn thử nhấp vào bất kỳ hình tròn nào trước và sau khi sao chép và dán. Sau khi dán, các thuộc tính trình xử lý sự kiện onclick có thể nguy hiểm sẽ bị xoá.

Xác nhận

Nhóm Microsoft Edge đã triển khai dịch vụ hỗ trợ SVG cho API Bảng nhớ tạm không đồng bộ trong Chromium. Bài đăng này được Rachel Andrew và Anupam Snigdha xem xét.