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移动div层-javascript 拖动层
Mar 22 Javascript
javascript 窗口加载蒙板 内嵌网页内容
Nov 19 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
May 06 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
Dec 17 Javascript
Extjs 点击复选框在表格中增加相关信息行
Jul 12 Javascript
jquery实现网页定位导航
Aug 23 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
Mar 03 Javascript
layui之select的option叠加问题的解决方法
Mar 08 Javascript
Vue中使用的EventBus有生命周期
Jul 12 Javascript
Vuex实现简单购物车
Jan 10 Vue.js
最新最全的手机号验证正则表达式
Feb 24 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
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
php计算整个目录大小的方法
2015/06/01 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
vue实现分页组件
2020/06/16 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
python dataframe NaN处理方式
2019/12/26 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
工商管理本科毕业生求职信范文
2013/10/05 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
单身联谊活动方案
2014/01/29 职场文书
大班幼儿评语大全
2014/04/30 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
公司活动总结怎么写
2014/06/25 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
如何写好开幕词?
2019/06/24 职场文书
使用refresh_token实现无感刷新页面
2022/04/26 Javascript