在用戶執行粘貼操作的時候,
js
能夠獲得剪切板的內容,本文討論一下這個問題。
目前只有Chrome
支持獲取剪切板中的圖片數據。還好需要這個功能的產品目前只支持Chrome
和Safari
,一些Chrome
的新特性是可以盡情使用了,還是能夠覆蓋到大部分用戶的。所以本文只討論Chrome
如何使用和如何阻止Safari
,原理大概了解了,再研究其他瀏覽器相關的問題就容易多了。
paste
事件
可以用js
給頁面中的元素綁定paste
事件的方法,當用戶鼠標在該元素上或者該元素處於focus
狀態,綁定到paste
事件的方法就運行了。
綁定的元素不一定是input
,普通的div
也是可以綁定的,如果是給document
綁定了,就相當於全局了,任何時候的粘貼操作都會觸發。
事件對象
獲取事件對象
先寫一下事件綁定的代碼
pasteEle.addEventListener("paste", function (e){ if ( !(e.clipboardData && e.clipboardData.items) ) { return; } });
粘貼事件提供了一個clipboardData
的屬性,如果該屬性有items
屬性,那么就可以查看items
中是否有圖片類型的數據了。Chrome
有該屬性,Safari
沒有。
clipboardData
介紹
介紹一下clipboardData
對象,它實際上是一個DataTransfer
類型的對象,DataTransfer
是拖動產生的一個對象,但實際上粘貼事件也是它。
clipboardData
的屬性介紹
屬性 | 類型 | 說明 |
---|---|---|
dropEffect | String | 默認是 none |
effectAllowed | String | 默認是 uninitialized |
files | FileList | 粘貼操作為空List |
items | DataTransferItemList | 剪切板中的各項數據 |
types | Array | 剪切板中的數據類型 該屬性在Safari下比較混亂 |
items
介紹
items
是一個DataTransferItemList
對象,自然里面都是DataTransferItem
類型的數據了。
屬性
items
的DataTransferItem
有兩個屬性kind
和type
屬性 | 說明 |
---|---|
kind | 一般為string 或者file |
type | 具體的數據類型,例如具體是哪種類型字符串或者哪種類型的文件,即MIME-Type |
方法
方法 | 參數 | 說明 |
---|---|---|
getAsFile | 空 | 如果kind 是file ,可以用該方法獲取到文件 |
getAsString | 回調函數 | 如果kind 是string ,可以用該方法獲取到字符串,字符串需要用回調函數得到,回調函數的第一個參數就是剪切板中的字符串 |
在原型上還有一些其他方法,不過在處理剪切板操作的時候一般用不到了。
types
介紹
一般types
中常見的值有
text/plain、text/html、Files
值 | 說明 |
---|---|
text/plain | 普通字符串 |
text/html | 帶有樣式的html |
Files | 文件(例如剪切板中的數據) |
簡單demo
pasteEle.addEventListener("paste", function (e){ if ( !(e.clipboardData && e.clipboardData.items) ) { return ; } for (var i = 0, len = e.clipboardData.items.length; i < len; i++) { var item = e.clipboardData.items[i]; if (item.kind === "string") { item.getAsString(function (str) { // str 是獲取到的字符串 }) } else if (item.kind === "file") { var pasteFile = item.getAsFile(); // pasteFile就是獲取到的文件 } } });
注意如果是string
類型的數據,可能針對具體是text/plain
、text/html
進行分別的處理。
以上摘自:這里 ]
坑在這里
根據親自測驗,遇到了一個很大的坑,暫時還不知道該怎么解決:
當ctrl+c復制圖片並粘貼之后,clipboaddata的
DataTransferItem {kind: "string", type: "text/html"}
即輸出的str:
<meta http-equiv="content-type" content="text/html; charset=utf-8"><img src="http://img1.gtimg.com/cd/pics/hv1/154/103/2237/145487344.jpg" alt="大媽們在雅西高速上跳廣場舞 被警察及時阻止"/>
當右鍵復制圖片並粘貼之后,
DataTransferItem {kind: "file", type: "image/png"}
所以這里對於圖片如果想要獲取粘貼的圖片進行上傳,只有直接右鍵復制的圖片才能識別到,ctrl+c的並不能識別.....
最近自己在研究看能不能通過復制任意地方的圖片,粘貼到本地富文本編輯器窗口,粘貼自動上傳,這里研究了一下paste事件,但是相關事件很多,繼續摸索中.......
===========================================================2017.11.7 更新