将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 相关文章推荐
从sohu弄下来的flash中展示图片的代码
Apr 27 Javascript
利用404错误页面实现UrlRewrite的实现代码
Aug 20 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
Jun 14 Javascript
js 自动播放的实例代码
Nov 19 Javascript
JavaScript之IE的fireEvent方法详细解析
Nov 20 Javascript
jQuery判断checkbox是否选中的3种方法
Aug 12 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
Mar 13 Javascript
JS遍历对象属性的方法示例
Jan 10 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
详解webpack自定义loader初探
Aug 29 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
Apr 25 Javascript
微信小程序onShareTimeline()实现分享朋友圈
Jan 07 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
德生H-501的评价与改造
2021/03/02 无线电
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
php数字游戏 计算24算法
2012/06/10 PHP
php的dl函数用法实例
2014/11/06 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
js常见表单应用技巧
2008/01/09 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
vue之浏览器存储方法封装实例
2018/03/15 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
python MD5加密的示例
2020/10/19 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
浙大网新C/C++面试解惑
2015/05/27 面试题
创业计划书怎样才能打动风投
2014/01/01 职场文书
小学语文国培感言
2014/03/04 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
销售员试用期自我评价
2014/09/15 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
2015年教研组工作总结
2015/05/04 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers