让Web页面中的编辑器支持黏贴或直接拖拽来添加图片「建议收藏」

让Web页面中的编辑器支持黏贴或直接拖拽来添加图片「建议收藏」让Web页面中的编辑器支持黏贴或直接拖拽来添加图片

大家好,又见面了,我是你们的朋友全栈君。

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

代码:

让Web页面中的编辑器支持黏贴或直接拖拽来添加图片「建议收藏」
让Web页面中的编辑器支持黏贴或直接拖拽来添加图片「建议收藏」

  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="width: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的复制黏贴,支持截屏的黏贴

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107088.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用户案例怎么写_用户运营案例

    用户案例怎么写_用户运营案例用户案例 – 3Cs

    2022年4月21日
    52
  • 投影矩阵介绍[通俗易懂]

    投影矩阵介绍[通俗易懂]一般我们是将相机模型简化成针孔相机模型,那么相平面与相机坐标系之间的关系为:通常为了方便,会把相平面放在小孔与目标点之间。下面就介绍下相平面投影的三种不同方法。透视投影(perspectiveprojection)通过相似三角形(下图两个虚线三角形)可以得到下列关系:展开就是:这里x_h等为齐次坐标系坐标,X等为相机坐标系点,x等则为相平面上的透视投影点,可以看出,投影点的位置不仅仅是与X等有简单的缩放关系,还和Z成反比,Z越大投影点x等越小,这就

    2022年9月28日
    3
  • Redis远程连接Redis客户端

    Redis远程连接Redis客户端在虚拟机的linux系统中一进入redis下的目录二启动redis服务三连接客户端四在windows本地中安装redis可视化软件五在linux关闭客户端六设置防火墙规则:我的因为已经设置过设置防火墙规则:firewall-cmd–zone=public–add-port=6379/tcp–permanent七设置密码:修改redis.conf…

    2022年5月3日
    85
  • FRP内网穿透_frp内网穿透免杀教程

    FRP内网穿透_frp内网穿透免杀教程时间原因,我将我研究时候的文章分类整理。至于我补充的,如果看不懂就把所有我整理的连接看一遍再结合你们看的心得,应该就可以了。一Frp学习连接1先看:使用frp进行内网穿透-少数派补充:1简单描述就是在你想要访问的主机上和代理主机上都安装frp反向代理软件,你想要访问的主机是frp客户端,代理主机是frp服务端,负责帮你转发的(极个别情况下也不需要代理主机,像p2p模式),配置好ini文件就可以了。2我自己搭建的时候vps是阿里云,客户端是windows10,这样.

    2025年9月23日
    7
  • 免费google代理服务器_google服务器ip地址

    免费google代理服务器_google服务器ip地址有些朋友在登陆谷歌时遇到异常活动而出验证,但是无论怎么输入手机号谷歌都提示此手机号无法用于验证,这种问题大多人都会出现,滥用代理基本都会出现异常验证活动的.谷歌过程中过不了手机号验证,但是在网络上搜一大堆教程也没有用,说什么用QQ邮箱注册、网易邮箱注册等等,这些方法都烂大街了,滥用这些APP接口注册都会被谷歌封号处理的,请大家不要被网上诸多教程误解…

    2022年9月29日
    6
  • CUDA编程之快速入门(CUDA10)

    CUDA编程cmake基本模板cmake版本与命令cmake版本之间会有命令差异,高版本中会舍弃一些低版本中的命令。而网上找到的大部分的cuda程序cmake文件都是基于低版本的,基本上都是有 add_cuda_executable这个命令的版本。而这个命令在高版本中丢弃了,所以要修改win10预览版系统中cmake出错的问题如果安装的是win10的预览版或者其他什么原因,如果出现报错:–SelectingWindowsSDKversion10.0.19041.0totarge

    2022年4月10日
    178

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号