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

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

前言:



最近在处理公司的旧后台浏览器兼容问题,要求更换ewebeditor 编辑器,更换为ueditor 编辑器,并且要求 IE9/IE8/IE10/IE11/Micro Edge/Google/360 编辑器各项兼容,听说百度的编辑器兼容至IE6,以为简单的换个编辑器的我,在上面折腾了不少时间,本文针对具体问题进行处理,可能读者遇不到我这样的问题,事前说明:仅供参考仅供参考仅供参考


问题:



  1. 百度编辑器粘贴图片的时候,会出现暴露内网IP的隐患  - IE问题
  2. 百度编辑器Ctril + v粘贴图片功能在IE上面不触发任何效果的问题
  3. 特殊符号传输后台的转义问题,以及将数据库的html读取之后,由于双引号导致的截取页面报错问题
  4. 针对 iframe这种嵌套框架,在保存的之后,拿不到编辑器内容的兼容处理方式


百度编辑器粘贴图片的时候,会出现暴露内网IP的隐患  - IE问题



问题复现


使用粘贴图片就会出现如下的问题,在查看源代码的时候,出现了如图所示的暴露源代码的问题,出现问题原因不明:


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


解决办法:


  1. 非常简单,只需要关闭查看源代码的按钮就行,完美解决
  2. 如果一定要保留,在不知道如何处理的情况下,并且急需交差的时候,可以这么干(当时情况是第二天就得交差,由于一直找不到问题点,加班到晚上10想出来的办法)


障眼法:


先直接上代码:


// 点击源代码按钮对于编辑器的内容进行敏感href信息处理 2019.9.24
    $('body').delegate(".edui-button-wrap","click",function(){
        var editTxt = $('.edui-editor-iframeholder').find('textarea')
        if(editTxt.length){
            var content = UE.getEditor('ueditor').getContent();
            var aE = $('<div></div>');
            aE.html(content)
            // alert(aE)
            aE.find('p.filedata').each(function(){
                var newA = $(this).find('a')
                // alert(newA.attr('href'))
                if(newA.attr('href').indexOf("http://")>=0 || newA.attr('href').indexOf("https://")>=0){
                    var arr = newA.attr('href').split('/')
                    var newTxt = ''
                    for(var i=3; i<arr.length;i++){
                        newTxt +='/'+arr[i]
                    }
                    newA.attr('href',newTxt)
                }
            })
            // alert(content);
            // 获取转义之后的字符
            var formatTxt = toTxt(aE.html());
            // formatTxt = appendBrToPAlfter(formatTxt);
            editTxt.html(formatTxt);
        }
    });
    /*正则表达式 替换括号,尖括号等*/
    function toTxt(str) {
        var RexStr = /\<|\>|\"|\'|\&/g
        str = str.replace(RexStr, function(MatchStr) {
            switch (MatchStr) {
                case "<":
                    return "&lt;";
                    break;
                case ">":
                    return "&gt;";
                    break;
                case "\"":
                    return "&quot;";
                    break;
                case "'":
                    return "&#39;";
                    break;
                case "&":
                    return "&amp;";
                    break;
                default:
                    break;
            }
        })
        return str;
    }
复制代码


  1. 绑定一个失去焦点的事件,在读取源代码的时候,对于内容进行截断
  2. 重新为href 赋值,保证连接无内网地址
  3. 去除掉内容里面的特殊标签,
  4. 重新为富文本框赋值


总结:


  1. 比较搞笑的解决方式,但是当领导掐着你脖子的时候,解决问题永远是第一位。至少这种方式上线之后,没有反馈出现过问题,各个版本的浏览器都是兼容的,算是逃过一劫
  2. 个人建议富文本编辑器有空多去玩玩查看源代码的功能,有时候编辑器的默认设置可能会坑了你,比如百度编辑器默认会加上 p 标签。。。。


特殊符号传输后台的转义问题,以及读取数据的问题

&



针对 iframe这种嵌套框架,在保存的之后,拿不到编辑器内容的兼容处理方式



问题复现:


由于旧后台是使用iframe进行拼接旧后台系统,在保存的时候,表单无法拿到富文本编辑框的内容,并且在读取的时候,会导致一些样式代码被截断导致内容显示不全的问题。


我们都知道富文本在数据库存储的一般都是html原文,一般的系统都会对一些 < > \ $ % 这种字符进行转义处理或者拦截。所以我们直接用js传原生文本肯定是不行的,需要进过如下的处理:


存储的时候:


  1. 转移特殊符号,替换原文本
  2. 拦截器拦截检测是否有特殊文本,进行二次转义
  3. 存储之前,将转义字符变为原始 < > 等标签,替换内容
  4. 将富文本存储到数据库,完成

读取的时候:

  1. 读取数据库的内容
  2. 回显内容到富文本编辑器(这一步其实会遇到非常多的奇怪问题,请看下文)

至于保存的时候,这里的实际情况是,旧版本的ewebeditor,在父iframe也就是表单的父页面使用了一个textarea 标签来保存具体的内容,导致即使我在iframe操作之后,依然会出现问题。


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


解决办法:


也是直接上代码:


var ue = UE.getEditor('ueditor');
    //初始化内容
    window.onload = function(){
        setTimeout(function(){
            ue.setContent($('#'+QueryStringByName('id'), parent.document).val())
        },500)
    }
    // 绑定失去焦点事件
    ue.addListener('blur',function(editor){
        var content = UE.getEditor('ueditor').getContent();
        var aE = $('<div></div>');
        aE.html(content)
        aE.find('p.filedata').each(function(){
            var newA = $(this).find('a')
            if(newA.attr('href').indexOf("http://")>=0 || newA.attr('href').indexOf("https://")>=0){
                var arr = newA.attr('href').split('/')
                var newTxt = ''
                for(var i=3; i<arr.length;i++){
                    newTxt +='/'+arr[i]
                }
                newA.attr('href',newTxt)
            }
        })
        content = toTxt(aE.html());
        //alert(content);
        $('#'+QueryStringByName('id'), parent.document).html(content)
    });
    //获取search参数
    function QueryStringByName(name){
        var result=window.location.search.match(new RegExp("[\?\&]" + name + "=([^\&]+)", "i"));
        if(result==null || result.length<0){
            return "";
        }
        return result[1];
    }
复制代码


  1. 在初始化的时候,跑去父窗口拿到数据的文本内容,做了一点点的延时加载。
  2. 使用blur 事件做 textarea 和 富文本编辑器的双向同步
  3. 同样需要处理内网地址暴露的问题,需要截取内网地址
  4. 对于特殊标签转义


总结:


  1. 富文本暂存区域,最好选隐藏域的 textarea,使用value 值会出现双引号截取的问题
  2. 小心转义带来的各种问题,一定要记得何时数据会被转义,同时什么阶段的数据内容是什么形式
  3. 关注富文本编辑器本身干的一些"杂活"
相关文章
|
存储 JSON JavaScript
Vue—Vue的项目结构,怎样用Vue3进行开发,如何起步Vue3
Vue—Vue的项目结构,怎样用Vue3进行开发,如何起步Vue3
Vue—Vue的项目结构,怎样用Vue3进行开发,如何起步Vue3
|
SQL 前端开发 关系型数据库
mysql根据父节点递归查询所有子节点,List转树形结构工具类
mysql根据父节点递归查询所有子节点,List转树形结构工具类
1446 0
mysql根据父节点递归查询所有子节点,List转树形结构工具类
|
小程序 前端开发 API
一文就知道uniapp等跨端开发的使用场景,学习成本,如何快速使用,基本语法等
uniapp是一个跨平台开发各种各样应用的一套框架。只需要写一套代码,可以适配多达14种产品类型,比如H5移动端、微信小程序及各种其他小程序,ios、安卓等接近原生APP的应用(可以上架到App Store或应用商店)。所以这里的多端,指的并不是PC、平板、手机端,而是移动端优先,开发者可以一次编码,分别编译为小程序和 Android 以及 iOS 应用,实现多端开发
1053 0
|
机器学习/深度学习 自然语言处理 物联网
Chronos: 将时间序列作为一种语言进行学习
Chronos框架预训练时间序列模型,将序列值转为Transformer模型的tokens。通过缩放、量化处理,模型在合成及公共数据集上训练,参数量20M至710M不等。优于传统和深度学习模型,展示出色零样本预测性能。使用分类交叉熵损失,支持多模态输出分布学习。数据增强策略包括TSMix和KernelSynth。实验显示大型Chronos模型在概率和点预测上超越多种基线,且微调小型模型表现优异。虽然推理速度较慢,但其通用性简化了预测流程。论文探讨了优化潜力和未来研究方向。
941 3
|
11月前
|
监控 Ubuntu 安全
debian或Ubuntu中开启ssh允许root远程ssh登录的方法
在Debian或Ubuntu系统中启用root用户的SSH远程登录需要编辑SSH配置文件、设置root密码并重启SSH服务。虽然这可以在某些情况下提供便利,但必须注意安全性,通过使用强密码、限制IP访问、使用SSH密钥认证等方法来保护服务器的安全。
4949 5
Vue2使用v-model封装ElementUI_DatePicker 日期选择器组件
本文介绍了如何在Vue2中使用v-model封装ElementUI的DatePicker日期选择器组件,并实现自定义属性和方法的结合使用,包括禁用日期、格式化日期等功能。
639 2
Vue2使用v-model封装ElementUI_DatePicker 日期选择器组件
|
Java 索引
Java“StringIndexOutOfBoundsException”解决
Java中的“StringIndexOutOfBoundsException”异常通常发生在尝试访问字符串中不存在的索引时。解决方法包括:1. 检查字符串长度,确保索引值在有效范围内;2. 使用条件语句避免越界访问;3. 对输入进行有效性验证。
1189 7
|
JSON 前端开发 API
使用微信JS-SDK调用发票接口的完整开发指南
本文介绍了如何使用微信JS-SDK的`chooseInvoiceTitle`接口来调用微信的发票功能。通过微信发票接口,用户可以选择开具个人或单位发票,并获取相关发票信息,如抬头、税号、公司地址等。在文中,详细描述了JS-SDK的初始化、发票接口的调用方式,并提供了完整的代码示例。文章还介绍了如何处理返回的发票信息,帮助开发者快速集成微信发票功能。
522 2
|
JSON 缓存 物联网
推荐一款go语言的开源物联网框架-opengw
推荐一款go语言的开源物联网框架-opengw
531 4
|
网络协议 PHP Python
推荐一些socket工具,TCP、UDP调试、抓包工具 推荐一些socket工具,TCP、UDP调试、抓包工具
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用。好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控。 假如有一天,你写“传统”的PHP有些累了,想玩玩socket了,搞搞python、NodeJS、GO之类的新兴语言或框架(当然我不是说这些语言不能写web),或者干脆就用PHP吧,事实上PHP5.
18077 0