让编辑器支持word复制黏贴、截屏的js代码


Posted in Javascript onOctober 17, 2016

chrome有很多人性化的API,比如拖拽, 比如图片可以转化为base64等;

比如知乎上面的回复中可以直接黏贴图片,  就不需要手动点击图片上传按钮, 选择图片, 确认上传等等; 知乎参考地址:打开 

 

让编辑器支持word的复制黏贴, 其中图片会转化为base64编码, 如果是通过远程打开这个静态页, 黏贴word文档的时候, 图片不会黏贴进来, 因为远程地址无法访问本地磁盘的绝对路径, 如果把下面代码保存成静态界面打开, 那么word中的图片都可以看见, 而且都会被转化为base64编码;

编辑器支持截屏的黏贴;

让编辑器支持图片直接拖拽, 直接拖拽即可添加图片, 功能更加强大, 而且图片也是base64编码; 

使用的话这new Edit(), 参数为一个可编辑的元素, 比如有contenteditable属性的div或者iframe元素等:

<html>
 <head></head>
 <body>
 <script src="http://cdn.bootcss.com/jquery/1.9.0/jquery.js"></script>

  <div id="edit" contenteditable="true" style="width:400px;height:400px;border:1px solid #f00">

  </div>

 <script>
  function Edit( editEl ) {
   editEl = $(editEl);

   $(editEl).bind("paste", clipFn);

   function clipFn(ev) {

    //把剪贴板中的img通过canvas中专为base64字符串;
    var canvas = document.createElement("canvas");
    var context = canvas.getContext("2d");

    //从word拷贝时候会得到text/html数据;
    var html = $(ev.originalEvent.clipboardData.getData("text/html"));
    html.find("img").each(function () {

     var img = document.createElement("img");
     var src = $(this).attr("src"); //.replace(/\\/gi,"\/");
     var _this = this;
     img.src = src;

     img.onload = function () {
      canvas.width = img.width;
      canvas.height = img.height;
      context.drawImage(img, 0, 0, img.width, img.height);
      var dataBase64 = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
      $("img").each(function (index, el) {
       //匹配图片;
       if ($(this).attr("src").replace(/[\/\\]/g,"") === src.replace(/[\/\\]/g,"")) {
        el.src = dataBase64;
       };
      });

      img.onerror = function() {
       console.log("图片加载失败");
      };

      img.onload = null;
     };

    });

    //如果通过截图或者复制图片的方式会得到 type为"imgage"的图片;
    var ele = ev.originalEvent.clipboardData.items;
    for (var i = 0; i < ele.length; ++i) {
     if ( ele[i].kind == 'file' && ele[i].type.indexOf('image/') !== -1 ) {

      var blob = ele[i].getAsFile();
      readBlobAsDataURL(blob, function( base64 ) {

       var img= document.createElement('img');
       img.setAttribute('src', base64);

       editEl.append(img);;
      });
      //阻止默认事件, 避免重复添加;
      ev.originalEvent.preventDefault();
     };
    };
   };

   //绑定拖拽事件
   //要给个响应
   editEl.bind("dragover", function() {
    return false;
   });

   //触发事件的响应
   editEl.bind("drop", function(ev) {
    loadImage( ev.originalEvent.dataTransfer.files[0] , function( result ) {
     editEl.append( "<img src="+result+" />" );
    });
    return false;
   });

   // 加载 图像文件(url路径)
   function loadImage(src, callback){
    // 过滤掉 非 image 类型的文件
    if(!src.type.match(/image.*/)){
     if(window.console){
      console.log("选择的文件类型不是图片: ", src.type);
     } else {
      window.confirm("只能选择图片文件");
     }
     return;
    }

    // 创建 FileReader 对象 并调用 render 函数来完成渲染.
    var reader = new FileReader();
    // 绑定load事件自动回调函数
    reader.onload = function(e){
     // 调用前面的 render 函数
     callback(e.target.result);
    };
    // 读取文件内容
    reader.readAsDataURL(src);
   };

   function readBlobAsDataURL(blob, callback) {
    var a = new FileReader();
    a.onload = function(e) {callback(e.target.result);};
    a.readAsDataURL(blob);
   };
  };
 </script>
 
 <script>
  new Edit("#edit");
 </script>
 </body>
</html>

很多网上的编辑器里 对图片的支持单一, 都会考虑IE6, IE7,  ff, chrome, 各种兼容问题;

这个解决方案适合基于chrome内核的浏览器, FF的兼容没有处理, 因为所有的图片数据都是基于base64, 图片就没有上传这一说法了,图片都变成了字符串, 不过这个有个劣势就是每一次提交的数据都会比较大;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery之自动完成组件的深入解析
Jun 19 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
Dec 25 Javascript
jquery禁用右键单击功能屏蔽F5刷新
Mar 17 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
Feb 02 Javascript
JS实现文字向下滚动完整实例
Feb 06 Javascript
BootstrapValidator超详细教程(推荐)
Dec 07 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 Javascript
详解如何使用babel进行es6文件的编译
May 29 Javascript
layui点击弹框页面 表单请求的方法
Sep 21 Javascript
vue中进行微博分享的实例讲解
Oct 14 Javascript
vuex刷新后数据丢失的解决方法
Oct 18 Javascript
详细谈谈JavaScript中循环之间的差异
Aug 23 Javascript
Node.js下自定义错误类型详解
Oct 17 #Javascript
js HTML5多媒体影音播放
Oct 17 #Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 #Javascript
js html5 css俄罗斯方块游戏再现
Oct 17 #Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 #Javascript
深入理解JS实现快速排序和去重
Oct 17 #Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 #Javascript
You might like
php二维码生成以及下载实现
2017/09/28 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
python with提前退出遇到的坑与解决方案
2018/01/05 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
python gdal安装与简单使用
2019/08/01 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
Python函数参数分类原理详解
2020/05/28 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
恒华伟业笔试面试题
2015/02/26 面试题
亲戚结婚的请假条
2014/02/11 职场文书
化妆品促销方案
2014/02/24 职场文书
经典商业广告词
2014/03/13 职场文书
创业培训计划书
2014/05/03 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
单位实习鉴定评语
2015/01/04 职场文书