עד עכשיו, Async Clipboard API תמך בקבוצה מוגבלת של סוגי MIME שאפשר להעתיק ללוח המערכת ולהדביק ממנו, ובפרט: text/plain
, text/html
ו-image/png
. בדרך כלל הדפדפן מנקה את הנתונים האלה, למשל כדי להסיר מחרוזת HTML אלמנטים מוטמעים מסוג script
או קישורים מסוג javascript:
, או כדי למנוע התקפות של פצצת דחיסה ב-PNG.
עם זאת, במקרים מסוימים כדאי לתמוך בתוכן לא מסונן בלוח העריכה:
- מצבים שבהם האפליקציה מטפלת בסניטיזציה בעצמה.
- מצבים שבהם חשוב מאוד שהנתונים המועתקים יהיו זהים לנתונים שמוצמדים.
במקרים כאלה, Async Clipboard API תומך עכשיו בפורמטים מותאמים אישית לאינטרנט שמאפשרים למפתחים לכתוב נתונים שרירותיים ללוח העריכה.
תמיכה בדפדפנים
החל מגרסה 76 של Chromium, יש תמיכה ב-Async Clipboard API עם תמיכה בתמונות. פורמטים מותאמים אישית של אינטרנט ל-Async Clipboard API נתמכים במחשבים וב-Chromium לנייד החל מגרסה 104.
כתיבת פורמטים מותאמים אישית של אינטרנט ללוח
כתיבת פורמטים מותאמים אישית של אינטרנט ללוח היא כמעט זהה לכתיבת פורמטים שהושמטו, מלבד הדרישה להוסיף את המחרוזת "web "
(כולל הרווחים בסוף) לסוג ה-MIME של ה-blob.
// 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);
}
קריאת פורמטים מותאמים אישית של אתרים מהלוח
בדומה לכתיבת טקסט, קריאת פורמטים מותאמים אישית של אינטרנט מהלוח דומה כמעט לקריאת פורמטים שהושמטו מהם נתונים אישיים. ההבדל היחיד הוא שהאפליקציה צריכה עכשיו לחפש פריטים בלוח העריכה שהסוג שלהם מתחיל ב-"web "
.
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);
}
יכולת פעולה הדדית עם אפליקציות ספציפיות לפלטפורמה
אפליקציות רגילות שפועלות בפלטפורמות ספציפיות לא מבינות פורמטים מותאמים אישית לאינטרנט כמו web image/jpeg
(כי הן מצפות ל-image/jpeg
). עם הזמן, צפוי שהאפליקציות הרלוונטיות יוסיפו תמיכה בפורמטים כאלה כאפשרות הסכמה, אם המפתחים שלהן יראו שתמיכה בפורמטים מותאמים אישית לאינטרנט רלוונטית למשתמשים שלהן. בלוח העריכה של מערכת ההפעלה, הפורמטים השונים נמצאים בכמה פורמטים מוכנים לשימוש, כפי שאפשר לראות בצילום המסך של macOS שבהמשך.
הדגמה (דמו)
אתם יכולים לנסות את הדמו ולעיין בקוד המקור כדי לראות איך הוא פועל.
תודות
המסמך הזה נבדק על ידי Joe Medley ו-François Beaufort.