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 相关文章推荐
用正则表达式 动态创建/增加css style script 兼容IE firefox
Mar 10 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
Jun 14 Javascript
MyEclipse取消验证Js的两种方法
Nov 14 Javascript
js获取url中的参数且参数为中文时通过js解码
Mar 19 Javascript
JavaScript实现继承的4种方法总结
Oct 16 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
Dec 18 Javascript
使用Javascript实现选择下拉菜单互移并排序
Feb 23 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
Apr 29 Javascript
javascript简易画板开发
Apr 12 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
Apr 02 jQuery
详解通过JSON数据使用VUE.JS
May 26 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 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将任何格式视频转为flv的代码
2009/09/03 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
js获取提交的字符串的字节数
2009/02/09 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
基于insertBefore制作简单的循环插空效果
2015/09/21 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
基于JSONP原理解析(推荐)
2017/12/04 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
Python中取整的几种方法小结
2017/01/06 Python
python 输出上个月的月末日期实例
2018/04/11 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
国培远程培训感言
2014/03/08 职场文书
国际会计专业求职信
2014/08/04 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
企业承诺书格式范文
2015/04/28 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
行政处罚告知书
2015/07/01 职场文书
母亲节感言
2015/08/03 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫