美文网首页
js粘贴截图

js粘贴截图

作者: 独享奢华 | 来源:发表于2017-09-28 17:56 被阅读233次

朋友做一个网络在线聊天室的功能,需要在聊天输入框中粘贴图片进行发送,在聊天框中通过 Ctrl + v 粘贴图片时进行图片的显示功能,所以抽空找了一下资料,实测以下找到的资料能够完成这个需求。

js利用clipboardData在网页中实现截屏粘贴的功能
目前仅有高版本的 Chrome 浏览器支持这样直接粘贴,其他浏览器目前为止还无法粘贴,不过火狐和ie11浏览器在可编辑的div中能够粘贴截图的图片也是base64位和Chrome利用clipboardData的效果是一样的,只是在火狐和ie11浏览器中目前还无法实现类似用clipboardData直接获取图片的base64数据,它是自带的直接进去img数据

完整实例:
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>利用clipboardData在网页中实现截屏粘贴的功能</title>
<style type="text/css">
    .box{ width:500px; height:300px; border:1px solid #ddd; }
    .box img{max-width:480px; max-height: 100%; text-align: center;}
</style>
</head>
<body>
  <div class="box" contenteditable="true" id="testInput">
  </div>
<script type="text/javascript">
  (function(){
    var imgReader = function( item ){
        var blob = item.getAsFile(),
            reader = new FileReader();
        reader.onload = function( e ){
            var img = new Image();
            img.src = e.target.result;
            console.log(img);
            document.getElementById('testInput').appendChild( img );
        };
        reader.readAsDataURL( blob );
    };

    document.getElementById( 'testInput' ).addEventListener( 'paste', function( e ){
        //window.clipboardData.getData("Text") ie下获取黏贴的内容 e.clipboardData.getData("text/plain")火狐谷歌下获取黏贴的内容
        //alert(e.clipboardData.getData("text/plain") )
        var clipboardData = e.clipboardData,//谷歌
            i = 0,
            items, item, types;
             console.log('0')

        if( clipboardData ){
             console.log('1')
            items = clipboardData.items;
            if( !items ){
                console.log(2)
                return;
            }
            console.log(3)
            item = items[0];
            types = clipboardData.types || [];
            for( ; i < types.length; i++ ){
                if( types[i] === 'Files' ){
                    item = items[i];
                    break;
                }
            }
            if( item && item.kind === 'file' && item.type.match(/^image\//i) ){
                imgReader( item );
            }
         }
     },false);
  })(); 
</script>
</body>
</html>
实例二:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="div" style="width:100%;height:700px;border:1px solid #ccc;padding:20px 0" contenteditable="true"></div>
  <script>
    var div = document.getElementById('div');
    div.addEventListener('paste', function(e) {
      if(e.clipboardData) {
        for(var i = 0; i < e.clipboardData.items.length; i++) {
          var c = e.clipboardData.items[i];
          var f = c.getAsFile();
          var reader = new FileReader();
          reader.onload = function(e) {
            div.innerHTML += '![](' + e.target.result + ')';
          }
          reader.readAsDataURL(f);
        }
      }
    });
  </script>
</body>
</html>
实现的方法:
方法一:

Chrome 浏览器中能够直接通过 clipboardData 获取截图的图片数据,可以用ajax将数据传给后台,然后由后台开发返回带域名的图片地址

方法二:

由于在火狐等浏览器中无法直接获取图片数据,所以可以在粘贴的时候获取div中的img的数据是base64的url数据,然后同方法一用ajax

方法三:

可以统一在点击发布或者保存消息时,获取div中的img的数据是base64的url数据,然后同方法一用ajax,如果有多张就循环,也或者是直接点击保存和发布的时候,后端开发做处理,返回来的显示信息中直接做处理,这样我们在div中就不需要把base64的url替换成后端返回的带域名的地址

方法四:

div中粘贴的时候弹出一个弹出层,然后弹出层中有截图的图片预览可确认上传按钮,点击上传按钮走ajax上传图片同方法一

转载自:http://www.cnblogs.com/dearxinli/p/4717047.html

知识扩展

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

我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢?

原理分析
提取操作:复制=>粘贴=>上传

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

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

转载自:http://www.jb51.net/article/80657.htm

相关文章

网友评论

      本文标题:js粘贴截图

      本文链接:https://www.haomeiwen.com/subject/nmdvextx.html