基于js粘貼事件paste簡單解析以及遇到的坑
在用戶執(zhí)行粘貼操作的時(shí)候,js能夠獲得剪切板的內(nèi)容,本文討論一下這個(gè)問題。
目前只有Chrome支持獲取剪切板中的圖片數(shù)據(jù)。還好需要這個(gè)功能的產(chǎn)品目前只支持Chrome和Safari,一些Chrome的新特性是可以盡情使用了,還是能夠覆蓋到大部分用戶的。所以本文只討論Chrome如何使用和如何阻止Safari,原理大概了解了,再研究其他瀏覽器相關(guān)的問題就容易多了。
paste事件
可以用js給頁面中的元素綁定paste事件的方法,當(dāng)用戶鼠標(biāo)在該元素上或者該元素處于focus狀態(tài),綁定到paste事件的方法就運(yùn)行了。
綁定的元素不一定是input,普通的div也是可以綁定的,如果是給document綁定了,就相當(dāng)于全局了,任何時(shí)候的粘貼操作都會觸發(fā)。
事件對象
獲取事件對象
先寫一下事件綁定的代碼
pasteEle.addEventListener("paste", function (e){
if ( !(e.clipboardData && e.clipboardData.items) ) {
return;
}
});
粘貼事件提供了一個(gè)clipboardData的屬性,如果該屬性有items屬性,那么就可以查看items中是否有圖片類型的數(shù)據(jù)了。Chrome有該屬性,Safari沒有。
clipboardData介紹
介紹一下clipboardData對象,它實(shí)際上是一個(gè)DataTransfer類型的對象,DataTransfer是拖動產(chǎn)生的一個(gè)對象,但實(shí)際上粘貼事件也是它。
clipboardData的屬性介紹
| 屬性 | 類型 | 說明 |
|---|---|---|
| dropEffect | String | 默認(rèn)是 none |
| effectAllowed | String | 默認(rèn)是 uninitialized |
| files | FileList | 粘貼操作為空List |
| items | DataTransferItemList | 剪切板中的各項(xiàng)數(shù)據(jù) |
| types | Array | 剪切板中的數(shù)據(jù)類型 該屬性在Safari下比較混亂 |
items介紹
items是一個(gè)DataTransferItemList對象,自然里面都是DataTransferItem類型的數(shù)據(jù)了。
屬性
items的DataTransferItem有兩個(gè)屬性kind和type
| 屬性 | 說明 |
|---|---|
| kind | 一般為string或者file |
| type | 具體的數(shù)據(jù)類型,例如具體是哪種類型字符串或者哪種類型的文件,即MIME-Type |
方法
| 方法 | 參數(shù) | 說明 |
|---|---|---|
| getAsFile | 空 | 如果kind是file,可以用該方法獲取到文件 |
| getAsString | 回調(diào)函數(shù) | 如果kind是string,可以用該方法獲取到字符串,字符串需要用回調(diào)函數(shù)得到,回調(diào)函數(shù)的第一個(gè)參數(shù)就是剪切板中的字符串 |
在原型上還有一些其他方法,不過在處理剪切板操作的時(shí)候一般用不到了。
types介紹
一般types中常見的值有
text/plain、text/html、Files
| 值 | 說明 |
|---|---|
| text/plain | 普通字符串 |
| text/html | 帶有樣式的html |
| Files | 文件(例如剪切板中的數(shù)據(jù)) |
簡單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類型的數(shù)據(jù),可能針對具體是text/plain、text/html進(jìn)行分別的處理。
坑在這里
根據(jù)親自測驗(yàn),遇到了一個(gè)很大的坑,暫時(shí)還不知道該怎么解決:
當(dāng)ctrl+c復(fù)制圖片并粘貼之后,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="大媽們在雅西高速上跳廣場舞 被警察及時(shí)阻止"/>
當(dāng)右鍵復(fù)制圖片并粘貼之后,
DataTransferItem {kind: "file", type: "image/png"}
所以這里對于圖片如果想要獲取粘貼的圖片進(jìn)行上傳,只有直接右鍵復(fù)制的圖片才能識別到,ctrl+c的并不能識別.....
最近自己在研究看能不能通過復(fù)制任意地方的圖片,粘貼到本地富文本編輯器窗口,粘貼自動上傳,這里研究了一下paste事件,但是相關(guān)事件很多,繼續(xù)摸索中....
以上這篇基于js粘貼事件paste簡單解析以及遇到的坑就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- JavaScript字符串轉(zhuǎn)數(shù)字的5種方法及遇到的坑
- 使用PHP json_decode可能遇到的坑與解決方法
- JavaScript代碼編寫中各種各樣的坑和填坑方法
- JavaScript中使用typeof運(yùn)算符需要注意的幾個(gè)坑
- Javascript中構(gòu)造函數(shù)要注意的一些坑
- JS大坑之19位數(shù)的Number型精度丟失問題詳解
- JS面試題大坑之隱式類型轉(zhuǎn)換實(shí)例代碼
- 對象題目的一個(gè)坑 理解Javascript對象
- 弱類型語言javascript開發(fā)中的一些坑實(shí)例小結(jié)【變量、函數(shù)、數(shù)組、對象、作用域等】
相關(guān)文章
微信小程序?qū)崿F(xiàn)視頻播放器發(fā)送彈幕
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)視頻播放器發(fā)送彈幕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
微信小程序語音同步智能識別的實(shí)現(xiàn)案例代碼解析
在一些小程序的開發(fā)場景中經(jīng)常會有語音轉(zhuǎn)文字的需求,今天小編通過實(shí)際案例給大家分享微信小程序語音同步智能識別功能,需要的朋友可以參考下2020-05-05
兩個(gè)DIV等高的JS的實(shí)現(xiàn)代碼
2007-12-12
JS簡單實(shí)現(xiàn)點(diǎn)擊按鈕或文字顯示遮罩層的方法
這篇文章主要介紹了JS簡單實(shí)現(xiàn)點(diǎn)擊按鈕或文字顯示遮罩層的方法,涉及javascript鼠標(biāo)事件響應(yīng)及頁面元素屬性動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04
JavaScript統(tǒng)計(jì)字符出現(xiàn)次數(shù)
這篇文章主要為大家詳細(xì)介紹了JavaScript字符統(tǒng)計(jì)出現(xiàn)次數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
javascript用defineProperty實(shí)現(xiàn)簡單的雙向綁定方法
這篇文章主要介紹了javascript用defineProperty實(shí)現(xiàn)簡單的雙向綁定方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
webpack中使用Eslint的實(shí)現(xiàn)
本文主要介紹了webpack中使用Eslint的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

