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中判断一个值是否在数组中并没有直接使用
Dec 17 Javascript
Js 冒泡事件阻止实现代码
Jan 27 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
Dec 23 Javascript
生成二维码方法汇总
Dec 26 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
详解AngularJS 模态对话框
Apr 07 Javascript
React.js入门实例教程之创建hello world 的5种方式
May 11 Javascript
原生js封装的一些jquery方法(详解)
Sep 20 Javascript
详解vue移动端项目的适配(以mint-ui为例)
Aug 17 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 Javascript
Django+Vue实现WebSocket连接的示例代码
May 28 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
IE中createElement需要注意的一个问题
2010/07/13 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
tensorflow实现简单的卷积网络
2018/05/24 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
Python面向对象封装操作案例详解
2019/12/31 Python
python与mysql数据库交互的实现
2020/01/06 Python
Python类继承和多态原理解析
2020/02/05 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
类和结构的区别
2012/08/15 面试题
18岁生日感言
2014/01/12 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
铲车司机岗位职责
2014/03/15 职场文书
同学会主持词
2014/03/18 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
预备党员群众意见
2015/06/01 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js