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 相关文章推荐
js展开闭合效果演示代码
Jul 24 Javascript
Javascript URI 解析介绍
Mar 15 Javascript
jquery图片轮播特效代码分享
Apr 20 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
Dec 20 Javascript
Summernote实现图片上传功能的简单方法
Jul 11 Javascript
angular route中使用resolve在uglify压缩后问题解决
Sep 21 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
Mar 03 Javascript
vue货币过滤器的实现方法
Apr 01 Javascript
jquery+css实现简单的图片轮播效果
Aug 07 jQuery
Vue实现表格中对数据进行转换、处理的方法
Sep 06 Javascript
详解Vue Cli浏览器兼容性实践
Jun 08 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
第十三节--对象串行化
2006/11/16 PHP
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
JSONP跨域请求
2017/03/02 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
python flask安装和命令详解
2019/04/02 Python
python挖矿算力测试程序详解
2019/07/03 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Python安装Bs4的多种方法
2020/11/28 Python
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
公司JAVA开发面试题
2015/04/02 面试题
高级Java程序员面试题
2016/06/23 面试题
《望庐山瀑布》教学反思
2014/04/22 职场文书
设备管理实施方案
2014/05/31 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
师德师风整改措施
2014/10/24 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
红楼梦读书笔记
2015/06/25 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书