HTML5技术

js粘贴事件paste简单解析及遇到的坑 - 蓓蕾心晴

字号+ 作者:H5之家 来源:H5之家 2017-09-06 15:17 我要评论( )

在用户执行粘贴操作的时候,js能够获得剪切板的内容,本文讨论一下这个问题。 目前只有Chrome支持获取剪切板中的图片数据。还好需要这个功能的产品目前只支持Chrome和Safari,一些Chrome的新特性是可以尽情使用了,还是能够覆盖到大部分用户的。所以本文只讨

在用户执行粘贴操作的时候,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:

当右键复制图片并粘贴之后,

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

所以这里对于图片如果想要获取粘贴的图片进行上传,只有直接右键复制的图片才能识别到,ctrl+c的并不能识别.....

 

 

最近自己在研究看能不能通过复制任意地方的图片,粘贴到本地富文本编辑器窗口,粘贴自动上传,这里研究了一下paste事件,但是相关事件很多,继续摸索中.......

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 移动端touch事件 || 上拉加载更多 - PC.aaron

    移动端touch事件 || 上拉加载更多 - PC.aaron

    2017-09-01 10:04

  • Html5 移动端 触摸滑动事件 - ChnHonKer-小河

    Html5 移动端 触摸滑动事件 - ChnHonKer-小河

    2017-08-22 17:07

  • .NET Core 事件总线,分布式事务解决方案:CAP - Savorboard

    .NET Core 事件总线,分布式事务解决方案:CAP - Savorboard

    2017-07-21 12:00

  • 通过JS拦截 pushState 和 replaceState 事件 - 夜闻香

    通过JS拦截 pushState 和 replaceState 事件 - 夜闻香

    2017-07-21 11:01

网友点评