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 arguments 多参传值函数
Oct 24 Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 Javascript
简介AngularJS中使用factory和service的方法
Jun 17 Javascript
JavaScript观察者模式(经典)
Dec 09 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
jQuery实现简单滚动动画效果
Apr 07 Javascript
原生javascript 学习之js变量全面了解
Jul 14 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
Vue2.0设置全局样式(less/sass和css)
Nov 18 Javascript
vuex实现像调用模板方法一样调用Mutations方法
Nov 06 Javascript
Node绑定全局TraceID的实现方法
Nov 14 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
Mar 10 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
php中的观察者模式简单实例
2015/01/20 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
PHPMailer发送邮件
2016/12/28 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
JS实现拼图游戏
2021/01/29 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
Web服务器框架 Tornado简介
2014/07/16 Python
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
Python 修改列表中的元素方法
2018/06/26 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
Python ini文件常用操作方法解析
2020/04/26 Python
python让函数不返回结果的方法
2020/06/22 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
任课老师推荐信范文
2013/11/24 职场文书
工作人员思想汇报
2014/01/09 职场文书
工程承包协议书
2014/04/22 职场文书
《长征》教学反思
2014/04/27 职场文书
篮球赛口号
2014/06/18 职场文书
教师师德考核自我评价
2014/09/13 职场文书
推销搭讪开场白
2015/05/28 职场文书
仙境之桥观后感
2015/06/16 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
如何利用golang运用mysql数据库
2022/03/13 Golang
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers