最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)_javascript技巧

来源:动视网 责编:小采 时间:2020-11-27 20:52:01
文档

js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)_javascript技巧

js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)_javascript技巧:我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=>上传 在这个操作过程中,我们需要做的就是:监听粘贴事件=>
推荐度:
导读js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)_javascript技巧:我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=>上传 在这个操作过程中,我们需要做的就是:监听粘贴事件=>
 我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢?

原理分析
提取操作:复制=>粘贴=>上传
在这个操作过程中,我们需要做的就是:监听粘贴事件=>获取剪贴板里的内容=>发请求上传
为方便理解下文,需要先明白几点:

  • 我们只能上传网页图(在网页上右键图片,然后复制)和截图(截图工具截的图片,eg:qq截图),不能粘贴上传系统里的图片(从桌面上、硬盘里复制),他们是存在完全不同的地方的。
  • 截图工具截的图与在网页点击右键复制的图是有些不同的,因此处理方式也不一样。
  • 知悉paste event这个事件:当进行粘贴(右键paste/ctrl+v)操作时,该动作将触发名为'paste'的剪贴板事件,这个事件的触发是在剪贴板里的数据插入到目标元素之前。如果目标元素(光标所在位置)是可编辑的元素(eg:设置了contenteditable属性的div。textarea并不行。),粘贴动作将把剪贴板里的数据,以最合适的格式,插入到目标元素里;如果目标元素不可编辑,则不会插入数据,但依然触发paste event。数据在粘贴的过程中是只读的。此段是翻译于w3.org_the-paste-action。
  • 可惜的是,经过试验,发现chrome(当前最新版)、firefox(当前最新版)、ie11对paste事件的实现并不是完全按照w3c来的,各自也有区别(w3c的paste标准也因此只是草案阶段)。
  • test代码及截图如下:

    chrome:

     
     
     
    

    1. event有clipboardData属性,且clipboardData有item属性,clipboardData.item中的元素(对象)有type和kind属性;
    2. 无论在哪进行粘贴,均可触发paste事件;
    3. 在div(未特殊声明时,本文div均指设置了contenteditable属性的div) 里粘贴截图,不显示图片。img.src为base64编码字符串;
    4. 在div里粘贴网页图片,直接显示图片,img.src为图片地址。

    firefox:

    1. event有clipboardData属性,clipboardData没有item属性;
    2. 只有在textarea里或者可编辑的div(里才粘贴才触发paste事件;
    3. 在div里粘贴截图,直接显示图片,img.src为base64编码字符串;
    4. 在div里粘贴网页图片,表现同chrome。

    ie11:(不截图了,可自行试验,其他浏览器同理<( ̄▽ ̄)/,因为懒...)

  • event没有clipboardData属性;
  • 只在可编辑的div中粘贴才触发paste事件;
  • 在div里粘贴截图,直接显示图片,img.src为base64编码字符串;
  • 在div里粘贴网页图片,表现同chrome。
  • 监听了paste事件,也知道了表现形式,接下来就是如何获取数据了:
    chrome有特定的方法,利用clipboardData.items、getAsFile()、new FileReader()等api可以在paste回调函数里获取到剪贴板里图片的base64编码字符串(无论是截图粘贴的还是网页图片复制粘贴的),ie11,firefox没有这样的api,不过依然有办法可以获取,因为数据已经表现在img的src里了,对于截图粘贴的,直接取img的src属性值(base64),对于网页粘贴的,则把地址传给后台,然后根据地址down下来,存在自己的服务器,最后把新地址返回来交给前端展示就ok了。为了保持一致性便于管理,统一将所有情况(截图、网页)中的img的src属性替换为自己存储的地址。因此可以得到以下核心代码(注释很全哦~~):

    html展示:

    
    
    Document
    
    

    前端js处理逻辑:

    用express.js搭的简易后台的接收逻辑:

    需要node环境:安装node=>npm intall=>node app.js)

    文档

    js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)_javascript技巧

    js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)_javascript技巧:我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=>上传 在这个操作过程中,我们需要做的就是:监听粘贴事件=>
    推荐度:
    标签: 图片 上传 粘贴
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top