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 相关文章推荐
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
Jan 29 Javascript
JavaScript中点击事件的写法
Jun 28 Javascript
js简单获取表单中单选按钮值的方法
Aug 23 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
Dec 17 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
详解微信小程序支付流程与梳理
Jul 16 Javascript
vue中uni-app 实现小程序登录注册功能
Oct 12 Javascript
javascript 高级语法之继承的基本使用方法示例
Nov 11 Javascript
JavaScript实现简易聊天对话框(加滚动条)
Feb 10 Javascript
原生JS利用transform实现banner的无限滚动示例代码
Jun 15 Javascript
js实现鼠标点击飘爱心效果
Aug 19 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
php中批量替换文件名的实现代码
2011/07/20 PHP
php继承的一个应用
2011/09/06 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
python的re正则表达式实例代码
2018/01/24 Python
Python实现的栈(Stack)
2018/01/26 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
PHP面试题大全
2015/10/16 面试题
初中音乐教学反思
2014/01/12 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
Python办公自动化PPT批量转换操作
2021/09/15 Python
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL