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添加String.Format方法
Aug 11 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
Dec 28 Javascript
js中精确计算加法和减法示例
Mar 28 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
Nov 03 Javascript
在JavaScript中处理时间之getHours()方法的使用
Jun 10 Javascript
Javascript 判断两个IP是否在同一网段实例代码
Nov 28 Javascript
JavaScript调用模式与this关键字绑定的关系
Apr 21 Javascript
js 实现在2d平面上画8的方法
Oct 10 Javascript
微信小程序实现富文本图片宽度自适应的方法
Jan 20 Javascript
vue配置font-awesome5的方法步骤
Jan 27 Javascript
layui table复选框禁止某几条勾选的实例
Sep 20 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
May 01 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 Javascript
在php中取得image按钮传递的name值
2006/10/09 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
详解React中setState回调函数
2018/06/14 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
大学应届毕业生个人求职信
2013/09/23 职场文书
即兴演讲稿
2014/01/04 职场文书
融资租赁计划书
2014/04/29 职场文书
社区清明节活动总结
2014/07/04 职场文书
整改报告怎么写
2014/11/06 职场文书
消防宣传标语大全
2015/08/03 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
前端JavaScript大管家 package.json
2021/11/02 Javascript