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对象创建及继承原理实例解剖
Feb 28 Javascript
jQuery文件上传插件Uploadify使用指南
Jun 05 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
Feb 28 Javascript
js实现网站最上边可关闭的浮动广告条代码
Sep 04 Javascript
js实现延时加载Flash的方法
Nov 26 Javascript
JavaScript是如何实现继承的(六种方式)
Mar 31 Javascript
通过扫描二维码打开app的实现代码
Nov 10 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
Jul 23 Javascript
mpvue跳转页面及注意事项
Aug 03 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 Javascript
解决vue打包后vendor.js文件过大问题
Jul 03 Javascript
JavaScript Html实现移动端红包雨功能页面
Jan 10 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.ini 配置文件的深入解析
2013/06/17 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
帝国cms目录结构分享
2015/07/06 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
初学python数组的处理代码
2011/01/04 Python
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
python操作ssh实现服务器日志下载的方法
2015/06/03 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
django的model操作汇整详解
2019/07/26 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
大学生村官任职感言
2014/01/09 职场文书
大学生村官承诺书
2014/03/28 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
用人单位聘用意向书
2015/05/11 职场文书
房屋所有权证明
2015/06/19 职场文书
民事调解协议书
2016/03/21 职场文书
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB