JS实现HTML标签转义及反转义


Posted in Javascript onApril 14, 2020

简单说一下业务场景,前台用户通过input输入内容,在离开焦点时,将内容在div中显示。

这时遇到一个问题,如果用户输入了html标签,则在div显示中,标签被解析。

由于是纯前端操作,不涉及后端,因此需要通过js对输入内容进行转义。

这里提供一个非常简单有效的转义方案,利用了innerHTMLinnerText

注:火狐不支持innerText,需要使用 textContent 属性,而IE早期版本不支持此属性,为了同时兼容IE及火狐,需要进行判断操作.

因为innerText(textContent)会获取纯文本内容,忽略html节点标签,而innerHTML会显示标签内容,

所以我们先将需转义的内容赋值给innerText(textContent),再获取它的innerHTML属性,这时获取到的就是转义后文本内容。

代码如下:

function HTMLEncode(html) {
 var temp = document.createElement("div");
 (temp.textContent != null) ? (temp.textContent = html) : (temp.innerText = html);
 var output = temp.innerHTML;
 temp = null;
 return output;
}
var tagText = "<p><b>123&456</b></p>";
console.log(HTMLEncode(tagText));//<p><b>123&456</b></p>

通过测试结果,可以看到html标签及&符都被转义后保存。

同理,反转义的方法为先将转义文本赋值给innerHTML,然后通过innerText(textContent)获取转义前的文本内容

function HTMLDecode(text) { 
 var temp = document.createElement("div"); 
 temp.innerHTML = text; 
 var output = temp.innerText || temp.textContent; 
 temp = null; 
 return output; 
} 
var tagText = "<p><b>123&456</b></p>";
var encodeText = HTMLEncode(tagText);
console.log(encodeText);//<p><b>123&456</b></p>
console.log(HTMLDecode(encodeText)); //<p><b>123&456</b></p>

编码反编码核心函数

function html_encode(str) 
  { 
    var s = ""; 
    if (str.length == 0) return ""; 
    s = str.replace(/&/g, "&"); 
    s = s.replace(/</g, "<"); 
    s = s.replace(/>/g, ">"); 
    s = s.replace(/ /g, " "); 
    s = s.replace(/\'/g, "'"); 
    s = s.replace(/\"/g, """); 
      s = s.replace(/\n/g, "<br/>"); 
    return s; 
  } 
 
  function html_decode(str) 
  { 
    var s = ""; 
    if (str.length == 0) return ""; 
    s = str.replace(/&/g, "&"); 
    s = s.replace(/</g, "<"); 
    s = s.replace(/>/g, ">"); 
    s = s.replace(/ /g, " "); 
    s = s.replace(/'/g, "\'"); 
    s = s.replace(/"/g, "\""); 
    s = s.replace(/<br\/>/g, "\n"); 
    return s; 
  } 
 
 
 
  console.log(html_decode('<div>123</div>')); 
  console.log(html_encode(html_decode('<div>123</div>')));

实例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
 function html_encode(str) 
  { 
    var s = ""; 
    if (str.length == 0) return ""; 
    s = str.replace(/&/g, "&"); 
    s = s.replace(/</g, "<"); 
    s = s.replace(/>/g, ">"); 
    s = s.replace(/ /g, " "); 
    s = s.replace(/\'/g, "'"); 
    s = s.replace(/\"/g, """); 
      s = s.replace(/\n/g, "<br/>"); 
    return s; 
  } 
 
  function html_decode(str) 
  { 
    var s = ""; 
    if (str.length == 0) return ""; 
    s = str.replace(/&/g, "&"); 
    s = s.replace(/</g, "<"); 
    s = s.replace(/>/g, ">"); 
    s = s.replace(/ /g, " "); 
    s = s.replace(/'/g, "\'"); 
    s = s.replace(/"/g, "\""); 
    s = s.replace(/<br\/>/g, "\n"); 
    return s; 
  } 
 
console.log(html_decode('<div>123</div>')); 
console.log(html_encode(html_decode('<div>123</div>')));
</script>
</head>
<body>

</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
用函数式编程技术编写优美的 JavaScript_ibm
May 16 Javascript
input+select(multiple) 实现下拉框输入值
May 21 Javascript
JS显示下拉列表框内全部元素的方法
Mar 31 Javascript
jQuery实现定位滚动条位置
Aug 05 Javascript
JavaScript 巧学巧用
May 23 Javascript
详解Vue路由钩子及应用场景(小结)
Nov 07 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
Nov 27 Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 Javascript
使用js在layui中实现上传图片压缩
Jun 18 Javascript
vue element-ui读取pdf文件的方法
Nov 26 Javascript
JavaScript进阶(一)变量声明提升实例分析
May 09 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
May 29 jQuery
jQuery基于ajax操作json数据简单示例
Jan 05 #Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 #Javascript
如何提高Dom访问速度
Jan 05 #Javascript
AngularJS中run方法的巧妙运用
Jan 04 #Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
Jan 04 #Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 #Javascript
基于jQuery实现选项卡效果
Jan 04 #Javascript
You might like
php 模拟POST|GET操作实现代码
2010/07/20 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
在python里从协程返回一个值的示例
2019/02/19 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
HTML5进度条特效
2014/12/18 HTML / CSS
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
亿企通软件测试面试题
2012/04/10 面试题
文秘大学生求职信
2014/02/25 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
教师个人总结范文
2015/02/11 职场文书
小学家长意见怎么写
2015/06/03 职场文书
新郎结婚感言
2015/07/31 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers
Python开发简易五子棋小游戏
2022/05/02 Python
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技