Angular中innerHTML标签的样式不起作用的原因解析


Posted in Javascript onJune 18, 2019

1.背景

         在最近angular的项目中,需要用到[innerHTML]标签来指定一个div的样式:

//HTML部分
 <div class="contents" [innerHTML]="contents"></div>

 //TS部分
 contents = '<p>商品信息栏位<br><span style="color:red;">商品信息介绍</span></p>';

        但是上面的样式并不起作用,在Chorme中查看源码,发现style标签的样式在Angular编译的时候被屏蔽掉。这是为什么呢?客观别急,请往下看。

2.解决方案

       先说解决方案,最后再分析出现这种问题的原因。修改上面的TS:

// 在使用的页面引入DomSanitizer 
 import { DomSanitizer } from '@angular/platform-browser';
//构造方法里注入sanitizer对象
 constructor( private sanitizer: DomSanitizer
 ) { }
// 对HTML代码做处理
 this.contents= this.sanitizer.bypassSecurityTrustHtml("<p>W3商品信息栏位<br><span style="color:red;">商品信息介绍</span></p>");

这样虽然可以解决问题,但是这样做还不够:

•代码冗余繁杂:如果我们的contents内容过大,这样我们的代码就显得很乱,影响可读性和美观;
•不能复用:如果其他ts中也要用到innerHTML标签,又要重新写一遍上面的TS内容,没有复用性;

      基于以上两点,我们用自定义管道(pipe)来优化以上代码,使用ng generate pipe safe-html命令来生成一个pipe,并做适当的修改:

// 对safe-html.pipe.ts做适当修改<br><br>import {Pipe, PipeTransform} from '@angular/core';
import {DomSanitizer} from '@angular/platform-browser';
@Pipe({name: 'safeHtml'})
export class SafeHtmlPipe implements PipeTransform {
 constructor(private sanitized: DomSanitizer) {
 }
 transform(value) {
  return this.sanitized.bypassSecurityTrustHtml(value);
 }
}<br><br>// 在使用innerHTML标签的属性里使用以上safeHtml管道

<div class="contents" [innerHTML]="contents|safeHtml"></div>

3.原因及原理

           所以,为什么会出现上面的问题呢?原来,Angular中默认将所有输入值视为不受信任。当我们通过 property,attribute,样式,类绑定或插值等方式,

   将一个值从模板中插入到DOM中时,Angular会自帮我们清除和转义不受信任的值。在开头的例子中,span标签里的样式被屏蔽了,不信请看:

  

Angular中innerHTML标签的样式不起作用的原因解析

  Angular 在编译的时候,会自动清理 HTML 输入并转义不安全的代码,因此在这种情况下,style被屏蔽,样式失效。这时候如果需要将样式片段渲染出来,

 就需要用到DomSanitizer了。DomSanitizer 可以把值净化为在不同 DOM 上下文中的安全内容,来帮我们防范跨站脚本攻击(XSS)类的安全问题。

总结

以上所述是小编给大家介绍的Angular中innerHTML标签的样式不起作用的原因解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Javascript计算两个marker之间的距离(Google Map V3)
Apr 26 Javascript
表单元素与非表单元素刷新区别详细解析
Nov 06 Javascript
通过JS来判断页面控件是否获取焦点
Jan 03 Javascript
页面装载js及性能分析方法介绍
Mar 21 Javascript
js同源策略详解
May 21 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
Dec 20 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
Jun 15 Javascript
jQuery图片拖动组件Dropzone用法示例
Jan 17 Javascript
layui 给数据表格加序号的方法
Aug 20 Javascript
Vue CLI3 如何支持less的方法示例
Aug 29 Javascript
通过Kettle自定义jar包供javascript使用
Jan 29 Javascript
AJAX检测用户名是否存在的方法
Mar 24 Javascript
小程序click-scroll组件设计
Jun 18 #Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 #Javascript
用Vue.js在浏览器中实现裁剪图像功能
Jun 18 #Javascript
JS删除String里某个字符的方法
Jan 06 #Javascript
简单了解Javscript中兄弟ifream的方法调用
Jun 17 #Javascript
vue中typescript装饰器的使用方法超实用教程
Jun 17 #Javascript
简单学习5种处理Vue.js异常的方法
Jun 17 #Javascript
You might like
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
token 机制和实现方式
2020/12/15 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
python3操作mysql数据库的方法
2017/06/23 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
django celery redis使用具体实践
2019/04/08 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
python编写俄罗斯方块
2020/03/13 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
安全生产投入制度
2014/01/29 职场文书
政府采购方案
2014/06/12 职场文书
听证通知书
2015/04/24 职场文书
公司岗位说明书
2015/10/08 职场文书
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis
Python保存并浏览用户的历史记录
2022/04/29 Python