让编辑器支持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 jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
JavaScript中的细节分析
Jun 30 Javascript
jquery动态增加删除表格行的小例子
Nov 14 Javascript
FF IE浏览器修改标签透明度的方法
Jan 27 Javascript
jQuery中removeClass()方法用法实例
Jan 05 Javascript
使用iojs的jsdom库实现同步系统时间
Apr 20 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
Aug 18 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
Oct 24 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
Feb 22 Javascript
详解express + mock让前后台并行开发
Jun 06 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
Feb 07 Javascript
JS内置对象和Math对象知识点详解
Apr 03 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
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
js实现一键复制功能
2017/03/16 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python生成数字图片代码分享
2017/10/31 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Python print不能立即打印的解决方式
2020/02/19 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
顶撞领导检讨书
2014/01/29 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
Python os和os.path模块详情
2022/04/02 Python