将HTML的左右尖括号等转义成实体形式的两种实现方式


Posted in Javascript onMay 04, 2014

前端开发工作中,经常需要将HTML的左右尖括号等转义成实体形式。我们不能把<,>,&等直接显示在最终看到的网页里。需要将其转义后才能在网页上显示。

转义字符(Escape Sequence)也称字符实体(Character Entity)。定义转义字符串的主要原因是

“<”和“>”等符号已经用来表示HTML TAG,因此不能直接当作文本中的符号来使用。但有时需求是在HTML页面上使用这些符号,所以需要定义它的转义字符串。
有些字符在ASCII字符集中没有定义(如版权符号“©”)。因此需要使用转义字符(“©”对应的转义字符是“©”)来表示。

这里提供两个函数escape和unescape,分别实现将HTML转义为实体和回转。

方式一、一个映射表+正则替换

var keys = Object.keys || function(obj) { 
obj = Object(obj) 
var arr = [] 
for (var a in obj) arr.push(a) 
return arr 
} 
var invert = function(obj) { 
obj = Object(obj) 
var result = {} 
for (var a in obj) result[obj[a]] = a 
return result 
} 
var entityMap = { 
escape: { 
'&': '&', 
'<': '<', 
'>': '>', 
'"': '"', 
"'": ''' 
} 
} 
entityMap.unescape = invert(entityMap.escape) 
var entityReg = { 
escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'), 
unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g') 
} // 将HTML转义为实体 
function escape(html) { 
if (typeof html !== 'string') return '' 
return html.replace(entityReg.escape, function(match) { 
return entityMap.escape[match] 
}) 
} 
// 将实体转回为HTML 
function unescape(str) { 
if (typeof str !== 'string') return '' 
return str.replace(entityReg.unescape, function(match) { 
return entityMap.unescape[match] 
}) 
}

方式二、利用浏览器DOM API
// 将HTML转义为实体 
function escape(html){ 
var elem = document.createElement('div') 
var txt = document.createTextNode(html) 
elem.appendChild(txt) 
return elem.innerHTML; 
} 
// 将实体转回为HTML 
function unescape(str) { 
var elem = document.createElement('div') 
elem.innerHTML = str 
return elem.innerText || elem.textContent 
}

有个缺陷是只能转义“< > & ”,对于单引号,双引号都不转义。另外一些非ASCII也不能转义。选择时须注意。

比较:

方式1 代码量较大,但灵活性,完整性都比方式2强。可根据需求添加或减少映射表entityMap,且可以运行在任意JS环境中。

方式2 为hack方式,代码量少很多,利用浏览器内部API就行了转义和转回(主流浏览器都支持)。不具完整性,很明显只能在浏览器环境中使用(比如不能在Node.js中跑)。

Javascript 相关文章推荐
jquery animate 动画效果使用说明
Nov 04 Javascript
JS弹出层单纯的绝对定位居中示例代码
Feb 18 Javascript
node.js中的fs.write方法使用说明
Dec 15 Javascript
JavaScript计算两个日期时间段内日期的方法
Mar 16 Javascript
JavaScript数组去重的五种方法
Nov 05 Javascript
bootstrap导航条实现代码
Dec 28 Javascript
vue指令做滚动加载和监听等
May 26 Javascript
vue移动端实现手机左右滑动入场动画
Jun 17 Javascript
layui 富文本编辑器和textarea值的相互传递方法
Sep 18 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 Javascript
three.js 实现露珠滴落动画效果的示例代码
Mar 01 Javascript
比较node.js和Deno
Apr 27 Javascript
IE6-8中Date不支持toISOString的修复方法
May 04 #Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 #Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 #Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
May 04 #Javascript
使用JavaScript获取电池状态的方法
May 03 #Javascript
JavaScript打印网页指定区域的例子
May 03 #Javascript
js检测输入内容全为空格的方法
May 03 #Javascript
You might like
PHP编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
关于js类的定义
2011/06/28 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
原生js实现淘宝放大镜效果
2020/10/28 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
js实现时钟定时器
2020/03/26 Javascript
深入理解Django的自定义过滤器
2017/10/17 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
Python 硬币兑换问题
2019/07/29 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
abstract是什么意思
2012/02/12 面试题
毕业自我评价范文
2013/11/17 职场文书
甜品店创业计划书
2014/09/21 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
小学作文之描写天气
2019/08/15 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL