Angular中innerHTML标签的样式不起作用的原因解析

 更新时间:2019年06月18日 09:04:53   作者:一只小彩笔  
这篇文章主要介绍了Angular中innerHTML标签的样式不起作用详解 ,本文给出了解决方案,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

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 在编译的时候,会自动清理 HTML 输入并转义不安全的代码,因此在这种情况下,style被屏蔽,样式失效。这时候如果需要将样式片段渲染出来,

 就需要用到DomSanitizer了。DomSanitizer 可以把值净化为在不同 DOM 上下文中的安全内容,来帮我们防范跨站脚本攻击(XSS)类的安全问题。

总结

以上所述是小编给大家介绍的Angular中innerHTML标签的样式不起作用的原因解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • AngularJS入门教程之ng-class 指令用法

    AngularJS入门教程之ng-class 指令用法

    本文主要介绍AngularJS ng-class 指令,这里帮大家整理了ng-class资料和示例代码,学习AngularJS指令的同学可以参考下
    2016-08-08
  • AngularJS基础学习笔记之简单介绍

    AngularJS基础学习笔记之简单介绍

    AngularJS 不仅仅是一个类库,而是提供了一个完整的框架。它避免了您和多个类库交互,需要熟悉多套接口的繁琐工作。它由Google Chrome的开发人员设计,引领着下一代Web应用开发。也许我们5年或10年后不会使用AngularJS,但是它的设计精髓将会一直被沿用。
    2015-05-05
  • angularjs 获取默认选中的单选按钮的value方法

    angularjs 获取默认选中的单选按钮的value方法

    下面小编就为大家分享一篇angularjs 获取默认选中的单选按钮的value方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Angularjs添加排序查询功能的实例代码

    Angularjs添加排序查询功能的实例代码

    这篇文章主要介绍了Angularjs添加排序查询功能的实例代码,需要的朋友可以参考下
    2017-10-10
  • AngularJS基础 ng-dblclick 指令用法

    AngularJS基础 ng-dblclick 指令用法

    本文主要介绍AngularJS ng-dblclick 指令,这里对ng-dblclick基础资料整理并详细介绍,简单的代码实例和实现效果,希望能帮助学习AngularJS的朋友
    2016-08-08
  • 基于angular2 的 http服务封装的实例代码

    基于angular2 的 http服务封装的实例代码

    这篇文章主要介绍了基于angular2 的 http服务封装实例代码,
    2017-06-06
  • AngularJS的ng Http Request与response格式转换方法

    AngularJS的ng Http Request与response格式转换方法

    这篇文章主要介绍了AngularJS的ng Http Request与response格式转换方法,结合实例形式分析了AngularJS实现Request与response格式转换操作的相关设置与使用技巧,需要的朋友可以参考下
    2016-11-11
  • Angular中的NgZone.run()有什么用途

    Angular中的NgZone.run()有什么用途

    在Angular中,NgZone是一个服务,用于管理异步任务的执行,并提供一种在Angular区域内或外部显式运行代码的方式,NgZone.run方法是一种显式在Angular区域内运行函数的方式,本文介绍Angular中的NgZone.run()有什么用,感兴趣的朋友一起看看吧
    2024-01-01
  • angular过滤器实现排序功能

    angular过滤器实现排序功能

    这篇文章主要为大家详细介绍了angular过滤器实现排序功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 关于Angularjs中跨域设置白名单问题

    关于Angularjs中跨域设置白名单问题

    这篇文章主要介绍了Angularjs中关于跨域设置白名单问题,需要的朋友可以参考下
    2018-04-04

最新评论