基于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中创建实例与原型继承揭秘
Dec 21 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
Jul 30 Javascript
鼠标滚轴控制文本框值的JS代码
Nov 19 Javascript
Javascript中innerHTML用法实例分析
Jan 12 Javascript
JavaScript实现的字符串replaceAll函数代码分享
Apr 02 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
Jul 27 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
Oct 01 Javascript
简单实现Vue的observer和watcher
Dec 21 Javascript
Ajax基础知识详解
Feb 17 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
Vuex 模块化使用详解
Jul 31 Javascript
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
微信小程序实现轮播图效果
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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
php调用mysql数据 dbclass类
2011/05/07 PHP
关于PHP语言构造器介绍
2013/07/08 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Python中使用logging模块打印log日志详解
2015/04/05 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
详解Django 时间与时区设置问题
2019/07/23 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
配置管理计划的主要内容有哪些
2014/06/20 面试题
如何提高MySql的安全性
2014/06/19 面试题
活动总结书
2014/05/08 职场文书
小学毕业感言100字
2015/07/30 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL