几个月前,就有同事跟我反馈,说磨途歌的留言板有问题。当时看了一下,她用的是谷歌浏览器,确实打不出中文,才按下一个字母,英文字母就从输入法的输入框中直接跳出来了,更换火狐浏览器就没这个问题。很奇怪的是,在我电脑上的火狐浏览器跟谷歌浏览器都没有问题,一开始还以为是她电脑的问题,就没在意了。
最近在家里用谷歌浏览器写博客,也出现了上述的情况,才开始重视起来。检查了一遍,初步锁定问题出在ueditor编辑器本身,于是上ueditor官网看看有没有更新或者说明。果然,ueditor已经更新了好几个版本了,磨途歌用的是1.2.5.0版本,最新版本为1.2.6.1。
浏览了一下更新日志,发现ueditor官网确实提到有这个bug,并且已经修复了,小激动,看来选择有大公司背景的开源软件,是明智的。
因为磨途歌使用的ueditor编辑器做过调整,所以新版本的ueditor还得再修改一下才能用。
在调试阶段,磨途歌发现新版本的ueditor编辑器有个问题,转义单引号(')出错了!
例如下边的内容,用旧版本的js文件可以正常显示
1 2 | <?php $blog = 'mo2g.com' ; |
新版本的js显示如下
1 2 | <?php $blog = &# 039 ;mo2g.com&# 039 ;; |
经过分析,很快就找到问题的根源,接下来就给大家讲解。
在html里,很多符号都有其他的表示方法,给大家列出常用的符号:
显示结果 | html代码 | 简单描述 |
| 空格 | |
& | & | 指明有字符存在(特殊字符)的默认符号 |
" | " | 双引号 |
' | ' | 单引号 |
< | < | 小于号 |
> | > | 大于号 |
® | ® | 注册标志 |
© | © | 版权标志 |
™ | ™ | 商标标志 |
问题就出在新版本的ueditor把单引号(')转义成了',完全忽略了'也是单引号(')的事实,至少PHP还是把单引号(')转义成了'的。
这个问题也很容易修复,打开ueditor.all.js文件,往里边添加一些代码就好了。找到398行,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /** * 将str中的html符号转义,默认将转义''&<">''四个字符,可自定义reg来确定需要转义的字符 * @name unhtml * @grammar UE.utils.unhtml(str); => String * @grammar UE.utils.unhtml(str,reg) => String * @example * var html = '<body>You say:"你好!Baidu & UEditor!"</body>'; * UE.utils.unhtml(html); ==> <body>You say:"你好!Baidu & UEditor!"</body> * UE.utils.unhtml(html,/[<>]/g) ==> <body>You say:"你好!Baidu & UEditor!"</body> */ unhtml: function (str, reg) { return str ? str.replace(reg || /[&<"> '](?:(amp|lt|quot|gt|#39|nbsp);)?/g, function (a, b) { if (b) { return a; } else { return { ' < ':' < ', ' & ':' & ', ' "':'"', '>':'>', " '": ''' }[a] } }) : '' ; }, |
把其中的(?:(amp|lt|quot|gt|#39|nbsp);)改成(?:(amp|lt|quot|gt|#39|#039|nbsp);),问题解决。