Benutzerdefinierte Webformate für die Async Clipboard API

Bisher unterstützte die Async Clipboard API eine begrenzte Anzahl von MIME-Typen, die in die Systemzwischenablage kopiert und eingefügt werden sollen, insbesondere: text/plain, text/html und image/png. Der Browser überprüft dies normalerweise, um eingebettete Inhalte script-Elemente oder javascript:-Links aus einem HTML-String oder um PNG zu verhindern Dekomprimierungsbombenangriffe.

In einigen Fällen kann es jedoch wünschenswert sein, unbereinigte Inhalte in der Zwischenablage zu unterstützen:

  • Situationen, in denen die Anwendung mit der Bereinigung selbst arbeitet.
  • Situationen, in denen es entscheidend ist, dass die kopierten Daten mit den eingefügten Daten identisch sind

In solchen Fällen unterstützt die Async Clipboard API jetzt benutzerdefinierte Webformate, mit denen Entwickler beliebige Daten in die Zwischenablage verschieben.

Unterstützte Browser

Die Async Clipboard API an sich mit Bildunterstützung wird ab Chromium 76 unterstützt. Benutzerdefiniert (Web) Formate für die Async Clipboard API werden seit dem Version 104.

Benutzerdefinierte Webformate in die Zwischenablage schreiben

Das Schreiben benutzerdefinierter Webformate in die Zwischenablage ist fast identisch mit dem Schreiben von bereinigten Formaten, mit der Ausnahme, dass dem MIME-Typ des Blobs der String "web " (einschließlich des abschließenden Leerzeichens) vorangestellt werden muss.

// Fetch remote JPEG and GIF images and obtain their blob representations.
const [jpegBlob, gifBlob] = await Promise.all([
  fetch('image.jpg').then((response) => response.blob()),
  fetch('image.gif').then((response) => response.blob()),
]);

try {
  // Write the image data to the clipboard, prepending the blobs' actual
  // types (`"image/jpeg"` and "image/gif") with the string `"web "`, so
  // they become `"web image/jpeg"` and `"web image/gif"` respectively.
  // The code elegantly makes use of computed property names:
  // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Object_initializer#computed_property_names.
  const clipboardItem = new ClipboardItem({
    [`web ${jpegBlob.type}`]: jpegBlob,
    [`web ${gifBlob.type}`]: gifBlob,
  });
  await navigator.clipboard.write([clipboardItem]);
} catch (err) {
  console.error(err.name, err.message);
}

Benutzerdefinierte Webformate werden aus der Zwischenablage gelesen

Wie beim Schreiben ist das Lesen von benutzerdefinierten Webformaten aus der Zwischenablage fast identisch mit Bereinigende Formate lesen. Der einzige Unterschied ist, Die App muss jetzt nach Elementen in der Zwischenablage suchen, deren Typ mit "web " beginnt.

try {
  // Iterate over all clipboard items.
  const clipboardItems = await navigator.clipboard.read();
  for (const clipboardItem of clipboardItems) {
    for (const type of clipboardItem.types) {
      // Discard any types that are not web custom formats.
      if (!type.startsWith('web ')) {
        continue;
      }
      const blob = await clipboardItem.getType(type);
      // Sanitize the blob if you need to, then process it in your app.
    }
  }
} catch (err) {
  console.error(err.name, err.message);
}

Interoperabilität mit plattformspezifischen Apps

Benutzerdefinierte Webformate wie web image/jpeg sind nicht so plattformspezifisch Anwendungen verstehen (da sie image/jpeg erwarten würden). Im Laufe der Zeit sind besorgte Apps erwartet, dass sie solche Formate unterstützen, z. B. eine Opt-in-Funktion, wenn ihre Entwickler der Meinung sind, dass sie das Web unterstützen. benutzerdefinierte Formate so anpassen, dass sie für ihre Nutzer relevant sind. In der Zwischenablage des Betriebssystems befinden sich die verschiedenen Formate in mehreren Formaten zur Verfügung stehen, wie Sie in der Screenshot für macOS unten.

Zwischenablage- Erwartung unter macOS mit einer Karte mit benutzerdefinierten Formaten, auf der zwei benutzerdefinierte Webformate aufgeführt sind

Demo

Sie können die Demo unten ausprobieren und Sehen Sie sich den Quellcode an, um zu sehen, wie die Demo funktioniert.

Danksagungen

Dieser Artikel wurde von Joe Medley geprüft und François Beaufort. Hero-Image von Neon Tommy, verwendet unter einem CC-BY-SA 2.0-Lizenz