百度编辑器的那些坑(下)

简介: 百度编辑器的那些坑(下)

处理百度编辑器粘贴在IE失效的问题(目前未找到解决方案)



问题复现:


这也是我要说的重点问题,目前我依然没有找到解决办法,下面的内容都是我的个人尝试,希望找到有过处理经验的人或者有其他方式的办法,有偿感谢!!

第一个问题:在IE当中,使用ctrl + V 是没有任何反应和效果的,而在谷歌的浏览器下面,

第二个问题:在IE中, 复制粘贴word内容无法粘贴图片


无法解决的办法:


www.cnblogs.com/songsu/p/11…

遇事不决找谷歌,谷歌出了一篇这种文章,试下

大概在ueditor.all.js文件的23881行左右


bindEvents:{
            //插入粘贴板的图片,拖放插入图片
            'ready':function(e){
                var me = this;
                if(window.FormData && window.FileReader) {
                    domUtils.on(me.body, 'paste drop', function(e){
                        //判断剪贴板的内容是否包含文本
                        //首先解释一下为什么要判断文本是不是为空
                        //在ctrl+c word中的文字或者图片之后会返回1种(image/png)或者4种type(text/plain,text/html,text/rtf,image/png)类型的对象
                        //为了兼容4种格式的情况,做了如下的判断
                        //如下代码:e.originalEvent.clipboardData.items获得剪贴板的内容
                        //当粘贴了文本之后text是不为空的,同时也会返回当前文本的图片类型
                        //如果有文字的话不做任何的处理,如果只粘贴图片的话文本一定是空的,包括复制的桌面图片或者截图的图片
                        // var text = e.originalEvent.clipboardData.getData("text");
                        // if(text == ""){
                        //     var items=e.originalEvent.clipboardData.items;
                        //     for (var i = 0, len = items.length; i < len; i++) {
                        //         var item = items[i];
                        //         if ( item.kind == 'file' && item.type.indexOf('image/') !== -1 ) {
                        //             var blob = item.getAsFile();
                        //             getBase64(blob, function( base64 ) {
                        //                 //sendAndInsertImage(base64,me); 上传到服务器
                        //                 setBase64Image(base64,me);
                        //             });
                        //             //阻止默认事件, 避免重复添加;
                        //             e.originalEvent.preventDefault();
                        //         };
                        //     }
                        // }
                        //TODO 粘贴图片的根本问题点 20201010
                        var hasImg = false,
                            items;
                        //获取粘贴板文件列表或者拖放文件列表
                        items = e.type == 'paste' ? getPasteImage(e):getDropImage(e);
                        if(items){
                            var len = items.length,
                                file;
                            while (len--){
                                file = items[len];
                                if(file.getAsFile) file = file.getAsFile();
                                if(file && file.size > 0) {
                                    sendAndInsertFile(file, me);
                                    hasImg = true;
                                }
                            }
                            hasImg && e.preventDefault();
                        }
                    });
                    //取消拖放图片时出现的文字光标位置提示
                    domUtils.on(me.body, 'dragover', function (e) {
                        if(e.dataTransfer.types[0] == 'Files') {
                            e.preventDefault();
                        }
                    });
                    //设置loading的样式
                    utils.cssRule('loading',
                        '.loadingclass{display:inline-block;cursor:default;background: url(\''
                            + this.options.themePath
                            + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n' +
                            '.loaderrorclass{display:inline-block;cursor:default;background: url(\''
                            + this.options.themePath
                            + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' +
                            '}',
                        this.document);
                }
            }
        }
复制代码


针对内容进行的处理操作


function getPasteImage(e){
        return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items:null;
    }
    function getDropImage(e){
        return  e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files:null;
    }
    //TODO 执行插入图片的操作 20201010
    function setBase64Image(base64, editor) {
        editor.execCommand('insertimage', {
            src: base64,
            _src: base64
        });
    }
    //TODO 获得base64 20201010
    function getBase64(blob, callback) {
        var a = new FileReader();
        a.onload = function(e) {
            callback(e.target.result);
        };
        a.readAsDataURL(blob);
    };
复制代码


博客的方式是读取二进制流为Blob,然后调用原始的上传接口进行兼容,然而,我在直接套用之后,连谷歌的粘贴也失效了**(坑爹!)**

不用怀疑,肯定是:getPasteImage()中没有拿到想要的结果,所以我直接alert打印想要的内容,看下什么内容

加入代码console.log(e.clipboardData)看下IE什么效果(注意要使用高版本IE)

记得在测试之前,在粘贴板粘贴带图片内容的word内容,或者截个图粘贴到IE的富文本编辑框


网络异常,图片无法展示
|


不出所料,没有内容,我们直接打印 e 事件对象,看看有没有想要的内容


网络异常,图片无法展示
|


错了,使用console:


网络异常,图片无法展示
|


说实话,看不懂,凭感觉这里的dataTransfer没有内容,基本上是找不到如何获取粘贴板数据的点

所以个人判断是IE浏览器本身就对这种粘贴操作没有进行兼容或者处理(万恶的IE浏览器)

至此,我知道自己的能力不足,无法解决这个问题,所以跑去问前端了,然后前端百度一圈下来,和我说:"要不换个编辑器?"

我没有死心,继续搜索


其他方式:


其实有其他的组织或者公司已经对于这种word的上传问题进行了解决

ueditor文本编辑器支持ctrl+v图片文字样式


总结:

  1. 思路不错,但是基本属于闭门造车,并且还要安装一个exe的Active控件,无法解决问题
  2. 自己重写一个Active控件兼容处理

富文本编辑器粘贴word内容


总结:

  1. 其他公司二次开发,商用版本
  2. 个人版本要300多一年,比较麻烦
  3. 也是基于word的上传开发了插件,并且需要安装word上传的控件
  4. 感兴趣可以下载看下,localhost 和 "127.0.0.1" 可以正常上传和使用

UEditor单独图片上传组件!适用IE,Chrome,firefox.


总结:

  1. 不是一码事,针对上传操作做了一些兼容和优化而已,无法解决粘贴的问题

经过上面的尝试之后,发现还是没有特别好的解决方式,于是反馈给上级,不让问题留在自己手里。。。。。

官方Github: 问题描述:从word中复制的图片粘贴到UEditor中以后不能正常显示,work图片转存的按钮也不可用。


解决方案:参看 ISSUE


总结:

  1. 虽然官方的ISSUE 有人提过了,但是我访问404 啊。。。。
  2. 现在已经邮箱打扰,不知道给不给我这个菜鸟回复。。。。

连官方那边都找不到办法,有点万念俱灰,于是把问题网上抛了,八成需要换编辑器,又有的忙了。。。。


分享:



说了这么多,其实我最想说的是,解决问题建议各位一定要留下文档记录,哪怕是如何解决的也好。

我是一个后端的开发人员,但是却被安排到前端去处理前端的兼容性问题,其实当时顶着非常大的压力的,客户催得紧,经理也天天问我进度,辛好公司有一位干过全栈的大神在,我的许多奇葩的样式错乱和按钮点击问题都是找他帮忙解决的,我对IE的各种奇怪现象其实挺恶心的,最后还是拖累同事陪我加班到十点解决上面的暴露内网的问题。在解决之后,我说了这么一句话:“我这辈子都不想碰到IE了”,但是那位全栈的同事却和我说:“怕什么,我连IE6的兼容性都搞过,不是照样搞好,这些问题解决之后,这就是属于你的经验,你不断积累经验,才能比别人更多优势”,这对我今年的工作态度产生了很多的工作影响,我不在思考为了工作而工作,而是思考为了自己而工作,希望我的话对大家有帮助。


网络异常,图片无法展示
|


最后总结:



就以我这个老掉牙的系统来说,目前百度的编辑器兼容和支持是最好的,实在不想再换别的浏览器,或者说换之前再挣扎一下,所以写下。

欢迎各位前端大神指教,帮助一下我这个后端临时抽来解决前端问题的人QAQ

如果有好的解决方式,欢迎拍砖

相关文章
|
存储 JSON Rust
【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
2175 0
|
网络协议 网络安全 Linux
|
2月前
|
Java 数据库连接 开发者
Spring Framework 核心技术详解
本文档旨在深入解析 Java Spring Framework 的核心技术原理与应用。与侧重于快速开发的 Spring Boot 不同,本文将聚焦于 Spring 框架本身的设计理念、核心容器、控制反转(IoC)、面向切面编程(AOP)、数据访问与事务管理等基础且强大的模块。通过理解这些核心概念,开发者能够更深刻地领悟 Spring 生态系统的设计哲学,并具备解决复杂企业级应用开发问题的能力。
231 4
|
11月前
|
监控 负载均衡 安全
什么是DDoS攻击及如何防护DDOS攻击
通过上述防护措施,企业和组织可以构建全面的DDoS防护体系,有效抵御各类DDoS攻击,确保网络和服务的稳定运行。
8297 10
|
前端开发
Access to XMLHttpRequest at ‘xxxxx‘ from origin :xxxxx has been ssss,跨域访问
Access to XMLHttpRequest at ‘xxxxx‘ from origin :xxxxx has been ssss,跨域访问
|
存储 Ubuntu 应用服务中间件
在Docker中,怎么快速查看本地的镜像和容器?
在Docker中,怎么快速查看本地的镜像和容器?
|
缓存 前端开发 JavaScript
如何减少React中无关组件的重渲染
你是否同我一样,总是会遇到一些莫名其妙的渲染问题,有时为了解决bug,需要耗费相当气力来debug呢?快来一起学习下react re-render 这些小技巧吧,或许能帮你减少组件树中无关组件的重渲染及重挂载,可以提升性能,同时也能提高用户体验哟。 案例代码:https://github.com/buzingar/re-render-demos
2628 5
|
监控
查看服务器/IIS日志、log、访问信息基本方法
除了手动查看,你也可以使用日志分析工具,如Log Parser、AWStats等,这些工具可以帮助你更方便地分析日志数据。
2579 1
|
Rust 程序员 开发者
使用 Rust 开发一款类似于 GitBook 的程序
**Rust新手开发者分享开源项目 Typikon**:模仿MDBook,致力于简单Markdown到在线书的渲染。[GitHub](https://github.com/auula/typikon)上可找到源码,欢迎初学者一同学习与贡献。体验轻松构建静态网站,探索Rust之旅。🌟 加入讨论,共建更易用的GitBook替代品。在线文档见[https://typikonbook.github.io](https://typikonbook.github.io)。
198 1
|
消息中间件 存储 编解码
RocketMQ系列 | 全网最全的导致RocketMQ消息“丢失”的几个场景都在这了,肯定有你不知道!
发送时会丢失消息、消息存储场景丢失消息、消费时会丢失消息
1651 1