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 相关文章推荐
在IE下获取object(ActiveX)的Param的代码
Sep 15 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
js中substring和substr的详细介绍与用法
Aug 29 Javascript
js 用CreateElement动态创建标签示例
Nov 20 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
Sep 07 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
Mar 08 Javascript
微信小程序 地图map实例详解
Jun 07 Javascript
JavaScript实现省市联动过程中bug的解决方法
Dec 04 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
May 03 Javascript
在vue项目中正确使用iconfont的方法
Sep 28 Javascript
微信小程序 如何获取网络状态
Jul 26 Javascript
JavaScript实现移动端拖动元素
Nov 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 preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
初识PHP
2014/09/28 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
node.js实现端口转发
2016/04/14 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
python之生成多层json结构的实现
2020/02/27 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
Linux文件系统类型
2012/09/16 面试题
应届毕业生通用的自荐书范文
2014/02/07 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
小学班主任教育随笔
2015/08/15 职场文书
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL
vue自定义右键菜单之全局实现
2022/04/09 Vue.js