百度编辑器(Ueditor)最新版(1.4.3.3)插入锚点失败原因分析及BUG修复

时间:2022-09-18 23:36:39

用百度编辑器——Ueditor(版本1.4.3.3,2016-05-18日上线)插入锚点的时候,每次总是失败,百思不得其解。通过分析Ueditor的代码ueditor.all.js,可以看出Ueditor插入锚点的过程,实际上是一个img标签和a标签相互转换的过程,其代码如下:

'anchor':{
   //cmd:命令字符串,name:锚点名称
   execCommand:function (cmd, name) {
                  var range = this.selection.getRange(),img = range.getClosedNode();
                  if (img && img.getAttribute('anchorname')) {
                      if (name) {
                          img.setAttribute('anchorname', name);
                      } else {
                          range.setStartBefore(img).setCursor();
                          domUtils.remove(img);
                      }
                  } else {
                      if (name) {
                          //只在选区的开始插入
                          var anchor = this.document.createElement('img');
                          range.collapse(true);
                          domUtils.setAttributes(anchor,{
                              'anchorname':name,
                              'class':'anchorclass'
                          });
                          range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true);
                      }
                  } 
                           ……

分析上述代码,插入锚点的过程实际上在Ueditor中显示的时候其实是插入了一个图片(img元素),设置该img的anchorname属性为插入锚点的名字。生成的HTML代码形如”<img class='anchorclass' anchorname='title_01'>“其中“title_01”即为锚点的名字。代码看起来是没有问题的,笔者也多次使用alert调试,运行过程中是可以得到锚点的名称‘name’的值的,但是在编辑器中查看源代码的时候始终没有anchorname属性,于是笔者手动在得到的img标签中写入anchorname的属性值,结果切换到显示界面又切换回HTML界面后,该属性依然丢失,真可谓百思不得其解。接着查看针对插入锚节点时的输入规则(inputRule)和输出规则(outputRule)部分的代码,可以清晰的了解到输出时Ueditor会将拥有anchorname属性的img节点变成a(超级链接)节点,并将该img的anchorname属性值作为'a'的name属性值,这样就完成了一个图像锚像一个真正锚的变换,代码如下:

outputRule: function(root){
          utils.each(root.getNodesByTagName('img'),function(a){
              var val;
              if(val = a.getAttr('anchorname')){
                  a.tagName = 'a';
                  a.setAttr({
                      anchorname : '',
                      name : val,
                      'class' : ''
                  })
              }
          })
      },

而输入的时候使用的输入规则(inputRule),是当用户直接在其HTML源码界面中输入锚节点的代码(比如:”<a name="title_01"></a>“)时,当用户切换到显示界面的时候,系统会自动将该锚点转换成图片锚,该图片节点(img节点)的class="anchorclass",anchorname="title_01"(上述锚节点的name属性值),代码如下:

inputRule:function(root){
           utils.each(root.getNodesByTagName('a'),function(a){
               var val;
               if((val = a.getAttr('name')) && !a.getAttr('href')){
                   a.tagName = 'img';
                   a.setAttr({
                       anchorname :a.getAttr('name'),
                       'class' : 'anchorclass'
                   });
                   a.setAttr('name')
               }
           })
       },

这样用户看起来就有一个锚的图片在刚才插入锚的地方,而保存的时候仍然会使用outputRule,将该图片变成一个真正的锚。

代码的实现看起来一点问题也没有,可是为什么就是插入不了锚呢(实质上是在img节点中,无论如何也插入不了anchorname属性,这点我在官网也尝试过,也不行,可以说结结实实是个BUG)。

正当我以为该问题无解的时候,我突然发现原来在使用Ueditor的时候,除了引入了Ueditor.all.js外还引入了一个配置文件Ueditor.config.js,我觉得看看这个文件的代码,这一下,终于被我找到了原因所在。原来在这个配置文件中定义了每个HTML标签的过滤规则,也就是某个HTML标签只能有哪些属性,所以当我们加入其他属性的时候是会被编辑器过滤掉的,比如我给img添加的achorename属性(也就是上述程序在讲锚转换成图片的时候要插入的属性),因为在img的属性过滤的白名单中是没有该属性的,所以照成了插入的失败,也照成了编辑器插入锚节点时出现的BUG。同样,笔者还发现在‘a’标签的白名单中是没有‘name’属性的,也就是编辑器默认情况下是不能插入锚点的,将上述两个属性加入到配置文件中,问题得解,可以*的插入任何锚节点了。下面附上修改后的img和a标签的白名单:

// xss 过滤是否开启,inserthtml等操作

,xssFilterRules: true

//input xss过滤

,inputXssFilter: true

//output xss过滤

,outputXssFilter: true

// xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin

/js-xss/master/lib/default.js

,whitList: {

a:      ['target', 'href', 'title', 'class', 'style','name'],

……

img:    ['src', 'alt', 'title', 'width', 'height', 'id', '_src',

'loadingclass', 'class','anchorname']

当然还有其他的一些白名单,由于和本主题无关就不再一一罗列。以上就是我解决Ueditor插入锚点BUG的过程,也许您有更好的方法,请给我留言,谢谢!

本文首发于顶求网,转载请注明来源。

百度编辑器(Ueditor)最新版(1.4.3.3)插入锚点失败原因分析及BUG修复的更多相关文章

  1. 关于百度编辑器UEditor的一点说明

    大家在使用的时候要特别注意editor_config.js中的“URL”这个参数 我的理解:1.这个参数是editor整个结构的总路径          2.首先要把这个路径配置好了.才能正常的显示, ...

  2. 百度编辑器ueditor插入表格没有边框颜色的解决方法

    附:从word excel 中 复制的表格提交后无边框,参考这个同学的,写的很详细:   http://blog.csdn.net/lovelyelfpop/article/details/51678 ...

  3. 百度编辑器ueditor插入表格没有边框&comma;没有颜色的解决方法 2015-01-06 09&colon;24 98人阅读 评论&lpar;0&rpar; 收藏

    百度富文本编辑器..很强大.. - - ,不过有些BUG..真的很无解.. 最近用这个,发现上传的表格全部没有表框.. 解决办法如下: 转载的.. 百度编辑器ueditor插入一个表格后,在编辑过程中 ...

  4. 百度编辑器ueditor 异步加载时,初始化没办法赋值bug解决方法

    百度编辑器ueditor 异步加载时,初始化没办法赋值bug解决方法 金刚 前端 ueditor 初始化 因项目中使用了百度编辑器——ueditor.整体来说性能还不错. 发现问题 我在做一个编辑页面 ...

  5. 工具,如何去掉百度编辑器 ueditor 元素路径、字数统计等

    去掉如下截图: 在百度编辑器 ueditor 根目录下: ueditor.config.js 文件中 搜索并将参数elementPathEnabled设置成false即可 常用功能开关如下: ,ele ...

  6. &lbrack;转载&rsqb;百度编辑器-Ueditor使用

    前段时间发表过一篇关于“KindEditor在JSP中使用”的博文.这几天在沈阳东软进行JavaWeb方面的实习工作,在一个CMS系统的后台和博客板块中又要用到文本编辑器,突然发现了这个——百度编辑器 ...

  7. &lbrack;moka同学笔记&rsqb;百度编辑器Ueditor自动换行,添加&lt&semi;p&gt&semi;的问题(摘录)

     原文:http://www.cnblogs.com/kissdodog/p/5419919.html 百度编辑器Ueditor其实蛮好用的,后来使用了一段时间发现,每次打开后又保存,发现都会往内容的 ...

  8. 百度编辑器 ueditor &period;net开发

    ueditor1.4.3 下载地址:http://pan.baidu.com/s/1bnCQVtd   <!--editor--> <script type="text/j ...

  9. 百度编辑器ueditor获取不到内容?请把form放在table等其他元素最外面

    百度编辑器ueditor获取不到内容?请把form放在table等其他元素最外面. <form name="form" method="post" act ...

随机推荐

  1. 解决magento添加产品在前台不显示问题

    有时候我们在magento系统添加产品,前台不显示,最模板分析可能 以下几个原因: 1 添加新品要重新index一下,magento是静态的.html页面,不reindex不出来的.在System→I ...

  2. 非关系型数据库SequoiaDB虚拟机下应用再探

    上一次浅谈了SequoiaDB在虚拟机上的安装及在web下图形界面的基本操控,现在来体验命令行操作及运行samples文件. 基本DDL操作 首先在视窗窗口同时按Ctrl+Alt+T,进入到命令行窗口 ...

  3. 【SDK编程】

    #include <stdio.h> #include <windows.h> int main() { DeleteFile("C:\\test.txt" ...

  4. 新鲜出炉的Using Qt 3D to visualize music

    http://blog.qt.io/blog/2016/01/27/using-qt-3d-visualize-music/

  5. 苹果手机连接Wifi认证机制

    Wifi状态保持方法和nas设备 https://patents.google.com/patent/CN106793171A/zh 基于ios终端的离线wifi热点认证方法和认证系统 https:/ ...

  6. Centos7 安装 python2&period;7

    Centos7 安装 python 2.7.15 和 pip  1.先安装 GCC 包,如果没安装 GCC包 就输入以下命令行安装: (*注:以下记得使用 su 权限) yum install gcc ...

  7. 【Alpha 冲刺】 3&sol;12

    今日任务总结 (未完成) 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成API文档编写 已完成App端api,Web端api还在持续 时间紧 孙浩楷 理解掌握在线编辑插件使用 加深了对所 ...

  8. linux第三章学习笔记

    第三章 进程管理 进程是Unix操作系统抽象概念中最基本的一种. 进程管理是所有操作系统的心脏所在. 一.进程 1. 进程是处于执行期的程序.除了可执行程序代码,还包括打开的文件.挂起的信号.内核内部 ...

  9. rz -be 上传文件解压失败

    在把Windows上的文件传至Linux端时用到SecureCRT,一般小文件都没有问题,文件太大时则出现了上传后的文件只有几K大小,当然大于2个G的是不可能传的上去的了.对于几百M到1G多的大文件要 ...

  10. 使用git 将自己的本地文件git到github上面的完整过程

    1.  首先在github网站上新建一个仓库,复制仓库地址(HTTP形式或者SSH形式,后者利用SSH,在最后一步push 的时候可以不用输入用户名和密码). 2.  在本地某个你想要的(文件夹)目录 ...