让编辑器支持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 相关文章推荐
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
Jun 12 Javascript
jQuery中ajax的使用与缓存问题的解决方法
Dec 19 Javascript
jquery 图片缩放拖动的简单实例
Jan 08 Javascript
JS实现同时搜索百度和必应的方法
Jan 27 Javascript
javascript限制文本框输入值类型的方法
May 07 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
Dec 30 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
May 17 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
Aug 05 Javascript
Vue2.x中的父子组件相互通信的实现方法
May 02 Javascript
浅谈ElementUI中switch回调函数change的参数问题
Aug 24 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
Mar 08 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自动更新新闻DIY
2006/10/09 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
jQuery的学习步骤
2011/02/23 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
医院后勤自我鉴定
2013/10/13 职场文书
机械绘图员岗位职责
2013/11/19 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
上课说话检讨书500字
2014/11/01 职场文书
员工工作能力评语
2014/12/31 职场文书
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery
Golang map映射的用法
2022/04/22 Golang