让编辑器支持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 CHECKBOX全选,取消全选,反选方法三
Aug 30 Javascript
javascript数组去重3种方法的性能测试与比较
Mar 26 Javascript
JavaScript中的eval()函数详解
Aug 22 Javascript
JS可以控制样式的名称写法一览
Jan 16 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
Apr 08 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
Oct 27 Javascript
jQuery中页面返回顶部的方法总结
Dec 30 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
Aug 29 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
人大复印资料处理程序_补充篇
2006/10/09 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
Python与Redis的连接教程
2015/04/22 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Pygame框架实现飞机大战
2020/08/07 Python
Java如何格式化日期
2012/08/07 面试题
医药营销专业个人自荐信
2013/09/29 职场文书
配件采购员岗位职责
2013/12/03 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
白酒代理协议书范本
2014/10/26 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
Python访问Redis的详细操作
2021/06/26 Python