關於這個工具
這一頁要答的,是開發者真的會打的那句:我的剪貼簿裡到底有什麼?不是猜的。你點下去之後,它會問 navigator.clipboard.read(),把瀏覽器肯給的 MIME 全部列出來——text/plain、text/html、text/uri-list、image/png、image/svg+xml,還有 web application/x-vnd… 這種廠商自己的格式。一列就是一種型別、大小(bytes)、再加上適合那種型別的看法。不會上傳、不會留下紀錄,離開這個分頁就沒了。
不是一個文字框,是每種 MIME
貼進表單時,表單只會留下它要的那種。剪貼簿本身常常同時放著同一份內容的好幾種寫法。這一頁每種都列。hex 跟 hex editor 同一套說法:offset、16 bytes 一列、右邊 ASCII。圖片會顯示型別和大小;createImageBitmap 讀得懂才會給像素尺寸。某一個型別的 getType() reject 了,那格標 unavailable,其他格照常出。
最有價值的是 HTML 原文
從 Word 或 Notion 貼過來,偷偷跟來的常常是 text/html——一堆 inline style、mso-、被轉過的列表。這一頁把那段原文當文字顯示,先逸出過,所以不會變成 DOM。沒有 dangerouslySetInnerHTML,沒有 eval,不會寫進頁面。你只想看字的話看 text/plain 那列;HTML 那列是在解釋「為什麼貼上去會長那樣」。
被拒絕不是空的,unknown 也不是 denied
clipboard.read() 一定要從點擊或貼上來。這一頁不會在載入時自己讀。NotAllowedError 代表瀏覽器拒絕了,或還在等你做一個手勢——不是剪貼簿是空的。空的是另一種結果。navigator.permissions.query({ name: "clipboard-read" }) 在很多瀏覽器會 throw;throw 就顯示 unknown,不會寫成 denied。有些瀏覽器只實作 readText()。那種情況會寫「這個瀏覽器只回報純文字」,不會說「剪貼簿裡只有純文字」。
兩條路,因為它們會不一樣
Async Clipboard API 跟 paste 事件的 clipboardData.items 不是同一條管。Chrome 可能在 read() 時清過 HTML,另外留一個 web text/html;貼上事件看得到的型別,read() 不一定有,反過來也是。這一頁的貼上區是拿來對照的,不是第二個玩具。兩邊的結果都只留在這個分頁,離開就沒了。