让编辑器支持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 相关文章推荐
js中巧用cssText属性批量操作样式
Mar 13 Javascript
JS获取计算机mac地址以及IP的实现方法
Jan 08 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
Oct 29 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
Nov 18 Javascript
全面解析Bootstrap中form、navbar的使用方法
May 30 Javascript
AngularJS 模型详细介绍及实例代码
Jul 27 Javascript
JavaScript基于对象去除数组重复项的方法
Oct 09 Javascript
jquery实现焦点轮播效果
Feb 23 Javascript
JS验证input输入框(字母,数字,符号,中文)
Mar 23 Javascript
BootStrap 动态表单效果
Jun 02 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
Jul 20 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
Dec 13 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
轻松修复Discuz!数据库
2008/05/03 PHP
php限制文件下载速度的代码
2015/10/20 PHP
jquery tab标签页的制作
2010/05/10 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
浅析javascript 定时器
2014/12/23 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
Cython 三分钟入门教程
2009/09/17 Python
python设计模式大全
2016/06/27 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
python实现微信自动回复机器人功能
2019/07/11 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
学院书画协会部门岗位职责
2013/12/01 职场文书
家长会主持词开场白
2014/03/18 职场文书
珠宝店促销方案
2014/03/21 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
清洁工个人总结
2015/03/04 职场文书
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL