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 相关文章推荐
5秒后跳转到另一个页面的js代码
Oct 12 Javascript
JS获取URL中的参数数据
Dec 05 Javascript
node.js中的fs.truncateSync方法使用说明
Dec 15 Javascript
jQuery中outerHeight()方法用法实例
Jan 19 Javascript
Uploadify上传文件方法
Mar 16 Javascript
基于javascript实现图片滑动效果
May 07 Javascript
深入浅析JS Function()构造函数
Aug 22 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
Angular中响应式表单的三种更新值方法详析
Aug 22 Javascript
详解微信小程序工程化探索之webpack实战
Apr 20 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
Nov 09 Javascript
详解vite2.0配置学习(typescript版本)
Feb 25 Javascript
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
一个简单计数器的源代码
2006/10/09 PHP
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
php读取3389的脚本
2014/05/06 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
Python装饰器decorator用法实例
2014/11/10 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
个人公开承诺书
2014/03/28 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
庆六一宣传标语
2014/10/08 职场文书
党建工作汇报材料
2014/12/24 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python