让编辑器支持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 相关文章推荐
javascript中直接引用Microsoft的COM生成Word
Jan 20 Javascript
分享20个提升网站界面体验的jQuery插件
Dec 15 Javascript
jQuery实现流动虚线框的方法
Jan 29 Javascript
jquery实现可旋转可拖拽的文字效果代码
Jan 27 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
May 03 Javascript
jQuery的文档处理程序详解
May 10 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
浅谈jQuery 选择器和dom操作
Jun 07 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
Node.js 使用AngularJS的方法示例
May 11 Javascript
输入框跟随文字内容适配宽实现示例
Aug 14 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 字符串操作入门教程
2006/12/06 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
Python做文本按行去重的实现方法
2016/10/19 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
J2EE包括哪些技术
2016/11/25 面试题
企业管理部经理岗位职责
2013/12/24 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
严以律己学习心得体会
2016/01/13 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
学校就业保障协议书
2019/06/24 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python