基于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实现文字由下到上循环滚动的实例代码
Aug 09 Javascript
AngularJs上传前预览图片的实例代码
Jan 20 Javascript
解决修复npm安装全局模块权限的问题
May 17 Javascript
微信小程序动态增加按钮组件
Sep 14 Javascript
小程序转发探索示例
Feb 19 Javascript
Vue使用watch监听一个对象中的属性的实现方法
May 10 Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 Javascript
了解Javascript中函数作为对象的魅力
Jun 19 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
jQuery实现简单QQ聊天框
Aug 27 jQuery
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
JS 4个超级实用的小技巧 提升开发效率
Oct 05 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实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
10个示例带你掌握python中的元组
2020/11/23 Python
python中reload重载实例用法
2020/12/15 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
自我评价中英文语句
2013/11/30 职场文书
项目副经理岗位职责
2013/12/30 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
股份合作协议书
2014/04/12 职场文书
幼儿园教师求职信
2015/03/20 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android