JS剪切板应用clipboardData实例解析

作者:木棉时间:2026-10-30 07:40:04浏览:202

本文解析如何利用JavaScript的clipboardData API在网页中实现截屏粘贴功能。重点介绍Chrome直接获取图片数据,以及Firefox和IE11中通过处理div内img标签获取Base64数据的兼容方案,并提供四种后端交互与前端处理的具体实现方法。

浏览器兼容性与数据获取差异

目前仅高版本Chrome浏览器支持直接粘贴截屏,其他浏览器尚不支持。不过,Firefox和IE11浏览器在可编辑的div中能够粘贴截图图片,其效果与Chrome利用clipboardData获取Base64数据类似,只是Firefox和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>


</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" 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 += '<img src="' + e.target.result + '">';
     }
     reader.readAsDataURL(f);
    }
   }
  });
 </script>
</body>
</html>

四种实现方法详解

实现的方法:

方法一:在Chrome浏览器中,可以直接通过clipboardData获取截屏图片数据,使用ajax将数据传递给后台,再由后台开发返回带域名的图片地址。

方法二:由于Firefox等浏览器无法直接获取图片数据,可以在粘贴时获取div中img的Base64 URL数据,然后同方法一使用ajax。

方法三:可以在点击发布或保存消息时,统一获取div中img的Base64 URL数据,然后同方法一使用ajax;如果有多张图片则进行循环处理。或者,直接在点击保存和发布时由后端开发处理,在返回的显示信息中直接进行处理,这样前端div中无需将Base64 URL替换为后端返回的带域名地址。

方法四:在div中粘贴时弹出一个弹出层,弹出层中包含截屏图片预览和确认上传按钮,点击上传按钮后走ajax上传图片,流程同方法一。

作者最新文章