基于js粘贴事件paste简单解析以及遇到的坑


Posted in Javascript onSeptember 07, 2017

在用户执行粘贴操作的时候,js能够获得剪切板的内容,本文讨论一下这个问题。

目前只有Chrome支持获取剪切板中的图片数据。还好需要这个功能的产品目前只支持ChromeSafari,一些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事件,但是相关事件很多,继续摸索中....

以上这篇基于js粘贴事件paste简单解析以及遇到的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
又一个图片自动缩小的JS代码
Mar 10 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
Sep 02 Javascript
JavaScript生成随机数的4种自定义函数分享
Feb 28 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
Sep 16 Javascript
跟我学习javascript的undefined与null
Nov 17 Javascript
基于JavaScript Array数组方法(新手必看篇)
Aug 20 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
Nov 17 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
利用jqprint插件打印页面内容的实现方法
Jan 09 Javascript
详解javascript常用工具类的封装
Jan 30 Javascript
jQuery实现基本动画效果的方法详解
Sep 06 jQuery
Ajax实现局部刷新的方法实例
Mar 31 Javascript
微信小程序实现轮播图效果
Sep 07 #Javascript
使用mint-ui开发项目的一些心得(分享)
Sep 07 #Javascript
JavaScript+CSS相册特效实例代码
Sep 07 #Javascript
AngularJS 打开新的标签页实现代码
Sep 07 #Javascript
基于Cookie常用操作以及属性介绍
Sep 07 #Javascript
基于require.js的使用(实例讲解)
Sep 07 #Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 #Javascript
You might like
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
php查询whois信息的方法
2015/06/08 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
YII框架常用技巧总结
2019/04/27 PHP
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
layui表格实现代码
2017/05/20 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
python daemon守护进程实现
2016/08/27 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
Python实现手势识别
2020/10/21 Python
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
装修五一活动策划案
2014/01/23 职场文书
新任教师自我鉴定
2014/02/24 职场文书
个人自我鉴定总结
2014/03/25 职场文书
小班下学期评语
2014/05/04 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android