基于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 相关文章推荐
jQuery中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 Javascript
connect中间件session、cookie的使用方法分享
Jun 17 Javascript
js使用for循环查询数组中是否存在某个值
Aug 12 Javascript
三种取消选中单选框radio的方法
Sep 09 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
Dec 10 Javascript
js输出数据精确到小数点后n位代码
Jul 02 Javascript
javascript中异常处理案例(推荐)
Oct 03 Javascript
微信小程序实现YDUI的ScrollTab组件
Feb 02 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
Mar 27 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
自己动手封装一个React Native多级联动
Sep 19 Javascript
Ajax是什么?Ajax高级用法之Axios技术
Apr 21 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
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
JQUERY简单按钮轮换选中效果实现方法
2015/05/07 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
Python进程通信之匿名管道实例讲解
2015/04/11 Python
进一步了解Python中的XML 工具
2015/04/13 Python
python实现电脑自动关机
2018/06/20 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
模具毕业生推荐信
2014/02/15 职场文书
幼儿园中秋节活动反思
2014/02/16 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
基层工作经历证明
2015/06/19 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python