浏览器家园

TAG标签|网站导航| 手机访问:m.liulanqi.com

当前位置:首页开发学院JavaScript → JavaScript 从剪切版里粘贴图片- HTML5 Clipboard API hacking

JavaScript 从剪切版里粘贴图片- HTML5 Clipboard API hacking

时间:2023-06-27 12:48:05来源:整理作者:浏览器知识手机版

最近在做一个在线图片编辑器,觉得如果让用户使用剪切板来粘贴图片(而不是将图片保存到本地,然后再选取文件上传)会很方便。在衡量了客户的浏览器状况之后,我决定使用HTML5的local features来hack一下,最终想达到的效果就是:

  1. 用户在photoshop里编辑好原图(可能是从数码相机里传上来的照片)
  2. 然后在photoshop里选取一部分图片区域(比如说照片中的人脸)
  3. 然后在编辑器里点Ctrl + V
  4. 搞掂!photoshop可以关了(保存还是不保存就随便用户咯)

想一想,这一个工作用剪切板来代替文件上传是会方便很多(不用再单独将编辑结果保存为另外一个文件)

prepare!

所以,这个想法就从一个demo开始了。首先,要做好界面上的其他元素的渲染,这个编辑器的界面是用canvas来渲染的,所以要先了解一下canvas的世界里图片是怎样表示的。

about canvas

MDN上的这篇文章列出了一个简单的在canvas中使用位图的例子,然而如果不太考虑计算效率,我们能拿到粘贴过来的图像的dataURL的话,就最方便了,因为dataURL就是一个简单的字符串。

about clipboard

然后还要对“剪切板“这个系统功能有个简单的认识,不管是OSX, Windows, 还是Linux世界里的一堆桌面环境,现在都对剪切板有了以下共识:

  • 剪切板里可以装1个或者多个数据项
  • “粘贴一个图片文件”和“粘贴一块图片”是不同的(!important):

图片文件是作为一个文件出现的,它里面的数据可能是任意格式的甚至不是图片。而图片,就肯定是表示图片的数据,它不一定有文件名,而它的数据格式也因不同实现而不同。这篇文章介绍的是第二种情况哦(虽然以后有时间我们也可以把第一种情况给解决掉)。

choose your best favorite weapon!

下一步便是从剪切板里读数据啦。我目前的第一开发浏览器是chrome,所以就从chrome开始边调试边开发吧。对于chrome,开发者们自己写的教程文章很多,于是我便按照这一篇开始了,总结一下,步骤很简单:

  • 拦截元素的paste事件

可以是可编辑元素: input[contenteditable],也可以是全局元素: window,所以只有在这个元素被激活时(例如正在编辑一个 contenteditable 时),你的粘贴动作才会被拦截

  • event的数据里判断粘贴过来的内容是不是我们想要的内容(我们想要图片)
window.onpaste = (event)-> # it's coffeescript. don't panic!
  for item in event.clipboardData.items # 如果你是用 jQuery 拦截了 paste 事件,你需要用 event.originalEvent 来代替 event 
    if item.type.match /^image\// # item.type 为粘贴过来的内容的 mime-type,如 image/png
      # ...
  • 是图片!调用FileReader拿到它的dataURL
reader = new FileReader()
reader.onload = (event)=> # 注意这里是异步的哦
  getImageData event.target.result, (data)->
    console.log data
reader.readAsDataURL item.getAsFile()

faithful gecko

关于在Firefox里获取剪切板数据的文章相对要少一些,而且我发现刚才针对chrome使用的clipboardData.items其实是chrome的私有API,而不是HTML5的标准接口,而 Firefox 实现的才是标准的接口。好吧咱来看看标准里面是怎样说的,其实区别不大:

  • 需要从 event.clipboardData.types (一个类数组) 里判断粘贴过来的数据的类型
  • 需要用 event.clipboardData.getData(type) 方法来获取数据

可是我试了一下后发现一个严重的问题: Firefox不允许粘贴图片 / 在Firefox里粘贴图片时获取不到数据

ok, 其实以上那个链接中也说得很明白了,想粘贴图片,hack吧:ff里编辑[contenteditable]时,粘贴一个图片的话,ff会把图片当作图文混排的插图将它转化为一个<img />元素插进去(图片数据被转换成dataURL作为这个<img />元素的src属性了),所以该 hack 原理为:

  1. 激活(focus())一个隐藏的div[contenteditable]
  2. 获取paste事件

虽然ff不允许粘贴图片,但是paste事件还是能捕获到的,只不过从event.clipboardData获取不到任何数据

  1. setTimeout(..., 1),等待“下一刻”图片被插入到[contenteditable]里面
  2. 在这个[contenteditable]里面找到新添加的<img />元素,并拿到它的src属性(就是我们想要的东西——图片数据的dataURL)。

Internet Explorer, the troll

IE也没有实现HTML5标准里的API,但是IE有个挺简单的私有剪切板API,而且是从IE5.5就已经实现了的。IE的私有API异常简单——直接访问window.clipboardData.getData(type)就可以获取剪切板里的数据了。btw. 大部分同学应该能马上就想到HTML5标准API不设计成这样的原因,那就是:如果API是这样的,那网页便可以随时访问用户剪切板里的内容,用户的隐私便可能会被泄漏。

不过试了一下后发现了IE11和Firefox有一样的问题: 它不认粘贴来的图片,不过IE11的[contenteditable]也支持插入图片并将其转换成<img />,所以用和ff同样的hack来解决就好了。

old-fashioned Opera

Opera的情况和Firefox类似——实现了HTML5标准里的API,但是不支持粘贴图片。不过比较糟糕的是它的[contenteditable]里也不支持插入图片,所以我也暂时没有找到什么办法让它能支持粘贴图片。

Safari

Safari的情况也和Firefox类似,但是在Safari里粘贴至[contenteditable]的图片只会转换为webkit-fake-url://...的形式,而这个数据似乎对我们没有任何用,它只是个本地的临时url,只能在当前网页的<img />元素里显示图片,用javascript也读取不到(非同源),所以也暂时没办法让它支持粘贴图片了。

ps. webkit的bugzilla里有一个放了很久的issue,正是针对这个问题而言的,所以看来从[contenteditable]里粘贴暂时看来是没戏了,有其他办法么?

share!

其实俺一开始也到处搜索了一下,希望有人已经做了一个能实现粘贴图片功能的、支持不同浏览器的小lib(或者snippets),后来发现确实没有,所以俺就来做这个事儿吧,这样我的编辑器也可以简单地引用它来读取剪切板里的图片:

在这过程中我还找到了一些十分有用的资源(上文中没有提到的):

碎碎念

其实这个功能对于论坛很有用耶,看:

  1. 截图到剪切板
  2. 编辑完文字后按一下 Ctrl + V
  3. 发帖多么方便,生活多么美好
  4. 求又拍云赞助咱 ruby-china 一个免费 bucket 吧 @_@

转自:https://ruby-china.org/topics/17266

相关文章

  • 飞视浏览器看vip视频,飞视浏览器:VIP视频免费看

    什么是飞视浏览器飞视浏览器是一款基于Chromium内核的全新浏览器,其主打特色是可以免费观看VIP视频。与其他普通浏览器不同的是,飞视浏览器内置了强大的视频解析功能,可以解析多种视频网站的VIP视频资源,包括爱奇艺、优酷、腾讯视频等。无需破解VIP,也不需要任何会员账号,使用飞视浏览器即可畅享VIP视频内容。2.如何使用飞视浏览器观看VIP视频使用飞视浏览器观看VIP视频非常简单,只需要以下几个步骤:(1)下载并安装飞视浏览器,可在官网或各大软件下载站中下载。安装完成后打开浏览器。(2)在浏览器地址..
  • 苹果6 浏览器 朗读,苹果6内置浏览器能够进行朗读功能

    苹果6内置浏览器介绍苹果6是苹果公司推出的一款手机,内置了Safari浏览器作为默认浏览器。Safari浏览器是苹果公司自己开发的浏览器,也是MacOSX系统的默认浏览器。Safari浏览器的优点在于速度快、稳定性强、界面简洁美观等。同时,苹果6内置的浏览器还具备朗读功能,可以方便用户在阅读时听取文字内容。2.苹果6浏览器如何使用朗读功能苹果6浏览器的朗读功能非常简单易用,只需要在阅读网页的过程中,按下方框中的文字部分,系统会自动识别文字内容并开始朗读。用户可以自定义朗读速度、语音和音量等设置,在阅读..

Copyright 2019-2029 www.liulanqi.com 【浏览器家园】 版权所有

浏览器家园_下载浏览器就到浏览器家园 | 专注MAC浏览器和Windows浏览器下载和使用介绍

声明: 所有软件和文章收集整理来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告