溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于js粘貼事件paste的示例分析

發(fā)布時(shí)間:2021-09-01 14:38:17 來源:億速云 閱讀:108 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關(guān)基于js粘貼事件paste的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

目前只有Chrome支持獲取剪切板中的圖片數(shù)據(jù)。還好需要這個(gè)功能的產(chǎn)品目前只支持ChromeSafari,一些Chrome的新特性是可以盡情使用了,還是能夠覆蓋到大部分用戶的。所以本文只討論Chrome如何使用和如何阻止Safari,原理大概了解了,再研究其他瀏覽器相關(guān)的問題就容易多了。

paste事件

可以用js給頁面中的元素綁定paste事件的方法,當(dāng)用戶鼠標(biāo)在該元素上或者該元素處于focus狀態(tài),綁定到paste事件的方法就運(yùn)行了。

綁定的元素不一定是input,普通的div也是可以綁定的,如果是給document綁定了,就相當(dāng)于全局了,任何時(shí)候的粘貼操作都會(huì)觸發(fā)。

事件對(duì)象

獲取事件對(duì)象

先寫一下事件綁定的代碼

pasteEle.addEventListener("paste", function (e){
 if ( !(e.clipboardData && e.clipboardData.items) ) {
  return;
 }
});

粘貼事件提供了一個(gè)clipboardData的屬性,如果該屬性有items屬性,那么就可以查看items中是否有圖片類型的數(shù)據(jù)了。Chrome有該屬性,Safari沒有。

clipboardData介紹

介紹一下clipboardData對(duì)象,它實(shí)際上是一個(gè)DataTransfer類型的對(duì)象,DataTransfer是拖動(dòng)產(chǎn)生的一個(gè)對(duì)象,但實(shí)際上粘貼事件也是它。

clipboardData的屬性介紹

屬性類型說明
dropEffectString默認(rèn)是 none
effectAllowedString默認(rèn)是 uninitialized
filesFileList粘貼操作為空List
itemsDataTransferItemList剪切板中的各項(xiàng)數(shù)據(jù)
typesArray剪切板中的數(shù)據(jù)類型 該屬性在Safari下比較混亂

items介紹

items是一個(gè)DataTransferItemList對(duì)象,自然里面都是DataTransferItem類型的數(shù)據(jù)了。

屬性

items的DataTransferItem有兩個(gè)屬性kind和type

屬性說明
kind一般為string或者file
type具體的數(shù)據(jù)類型,例如具體是哪種類型字符串或者哪種類型的文件,即MIME-Type

方法

方法參數(shù)說明
getAsFile如果kindfile,可以用該方法獲取到文件
getAsString回調(diào)函數(shù)如果kindstring,可以用該方法獲取到字符串,字符串需要用回調(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ù),可能針對(duì)具體是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="https://cache.yisu.com/upload/information/20200622/114/66116.jpg" alt="大媽們?cè)谘盼鞲咚偕咸鴱V場舞 被警察及時(shí)阻止"/>

當(dāng)右鍵復(fù)制圖片并粘貼之后,

DataTransferItem {kind: "file", type: "image/png"}

所以這里對(duì)于圖片如果想要獲取粘貼的圖片進(jìn)行上傳,只有直接右鍵復(fù)制的圖片才能識(shí)別到,ctrl+c的并不能識(shí)別.....

感謝各位的閱讀!關(guān)于“基于js粘貼事件paste的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI