zoukankan      html  css  js  c++  java
  • 让Web页面中的编辑器支持黏贴或直接拖拽来添加图片

    基本原理是将剪贴板中的图片二进制数据转为Base64编码

    代码:

      1 <html>
      2     <head>
      3     </head>
      4     <body>
      5     <script src="http://cdn.bootcss.com/jquery/1.9.0/jquery.js">
      6             </script>
      7             
      8             <div id="edit" contenteditable="true" style="400px;height:400px;border:1px solid #f00">
      9                 
     10             </div>
     11             
     12             <script>
     13         function Edit( editEl ) {
     14                     editEl = $(editEl);
     15                     
     16                     $(editEl).bind("paste", clipFn);
     17                     
     18                     function clipFn(ev) {
     19                         
     20                         //把剪贴板中的img通过canvas中专为base64字符串;
     21                         var canvas = document.createElement("canvas");
     22                         var context = canvas.getContext("2d");
     23                         
     24                         //从word拷贝时候会得到text/html数据;
     25                         var html = $(ev.originalEvent.clipboardData.getData("text/html"));
     26                         html.find("img").each(function () {
     27                             
     28                             var img = document.createElement("img");
     29                             var src = $(this).attr("src");
     30                             //.replace(/\/gi,"/");
     31                             var _this = this;
     32                             img.src = src;
     33                             
     34                             img.onload = function () {
     35                                 canvas.width = img.width;
     36                                 canvas.height = img.height;
     37                                 context.drawImage(img, 0, 0, img.width, img.height);
     38                                 var dataBase64 = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
     39                                 $("img").each(function (index, el) {
     40                                     //匹配图片;
     41                                     if ($(this).attr("src").replace(/[/\]/g,"") ===  src.replace(/[/\]/g,"")) {
     42                                         el.src = dataBase64;
     43                                     }
     44                                     ;
     45                                 }
     46                                                          );
     47                                 
     48                                 img.onerror = function() {
     49                                     console.log("图片加载失败");
     50                                 }
     51                                     ;
     52                                 
     53                                 img.onload = null;
     54                             }
     55                                 ;
     56                             
     57                         }
     58                                                                  );
     59                         
     60                         //如果通过截图或者复制图片的方式会得到  type为"imgage"的图片;
     61                         var ele = ev.originalEvent.clipboardData.items;
     62                         for (var i = 0; i < ele.length; ++i) {
     63                             if ( ele[i].kind == 'file' && ele[i].type.indexOf('image/') !== -1 ) {
     64                                 
     65                                 var blob = ele[i].getAsFile();
     66                                 readBlobAsDataURL(blob, function( base64 ) {
     67                                     
     68                                     var img= document.createElement('img');
     69                                     img.setAttribute('src', base64);
     70                                     
     71                                     editEl.append(img);
     72                                     ;
     73                                 }
     74                                                                  );
     75                                 //阻止默认事件, 避免重复添加;
     76                                 ev.originalEvent.preventDefault();
     77                             }
     78                             ;
     79                         }
     80                         ;
     81                     }
     82                     ;
     83                     
     84                     //绑定拖拽事件
     85                     //要给个响应
     86                     editEl.bind("dragover", function() {
     87                         return false;
     88                     }
     89                                          );
     90                     
     91                     //触发事件的响应
     92                     editEl.bind("drop", function(ev) {
     93                         loadImage( ev.originalEvent.dataTransfer.files[0] , function( result ) {
     94                             editEl.append( "<img src="+result+" />" );
     95                         }
     96                                          );
     97                         return false;
     98                     }
     99                                          );
    100                     
    101                     // 加载 图像文件(url路径)
    102                     function loadImage(src, callback){
    103                         // 过滤掉 非 image 类型的文件
    104                         if(!src.type.match(/image.*/)){
    105                             if(window.console){
    106                                 console.log("选择的文件类型不是图片: ", src.type);
    107                             }
    108                             else {
    109                                 window.confirm("只能选择图片文件");
    110                             }
    111                             return;
    112                         }
    113                         
    114                         // 创建 FileReader 对象 并调用 render 函数来完成渲染.
    115                         var reader = new FileReader();
    116                         // 绑定load事件自动回调函数
    117                         reader.onload = function(e){
    118                             // 调用前面的 render 函数
    119                             callback(e.target.result);
    120                         }
    121                             ;
    122                         // 读取文件内容
    123                         reader.readAsDataURL(src);
    124                     }
    125                     ;
    126                     
    127                     function readBlobAsDataURL(blob, callback) {
    128                         var a = new FileReader();
    129                         a.onload = function(e) {
    130                             callback(e.target.result);
    131                         };
    132                         a.readAsDataURL(blob);
    133                     }
    134                     ;
    135         }
    136             ;
    137             </script>
    138             
    139             <script>
    140         new Edit("#edit");
    141             </script>
    142     </body>
    143 </html>
    View Code

    参考资料:

    让编辑器支持word的复制黏贴,支持截屏的黏贴

  • 相关阅读:
    jQuery对象和DOM对象的互转
    ASP.NET MVC单元测试Controller时添加上下文的方式
    基于Mongodb进行分布式数据存储【转】
    .NET平台上的编译器不完全列表
    实现自己的O/R Mapping组件高效缓存的思考
    .NET的动态语言
    C++类成员和数据成员初始化总结
    ACE Singleton
    Wiresshark
    C++
  • 原文地址:https://www.cnblogs.com/z-sm/p/6075182.html
Copyright © 2011-2022 走看看