基于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 相关文章推荐
javascript的字符串按引用复制和传递,按值来比较介绍与应用
Dec 28 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
Jun 19 Javascript
jquery实现select选中行、列合计示例
Apr 25 Javascript
javascript定时器取消定时器及优化方法
Jul 08 Javascript
Angularjs实现上传图片预览功能
Sep 01 Javascript
PHP自动加载autoload和命名空间的应用小结
Dec 01 Javascript
jQuery中库的引用方法
Jan 06 jQuery
js拖动滑块和点击水波纹效果实例代码
Oct 16 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
Dec 10 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
vue.js 子组件无法获取父组件store值的解决方式
Nov 08 Javascript
JavaScript实现简单的图片切换功能(实例代码)
Apr 10 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下使用curl模拟用户登陆的代码
2010/09/10 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
django用户登录验证的完整示例代码
2019/07/21 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
Weblogc domain问题
2014/01/27 面试题
升旗仪式主持词
2014/03/19 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
离婚协议书范本
2015/01/26 职场文书
初中教师个人总结
2015/02/10 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
宾馆安全管理制度
2015/08/06 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python
如何通过一篇文章了解Python中的生成器
2022/04/02 Python
详解SQL报错盲注
2022/07/23 SQL Server