Angular中使用 innerHTML 指令时自动移除style属性的原因及解决办法

假如后台返回的字符串中有 html标签 时,我们希望可以直接将该标签渲染出来,而 Angular 中提供了 [innerHTML] 内置指令来将字符串转为 HTML 代码

原因

但是基于 Angular官网 这里提到了:SecurityContext 标记了具有危险安全隐患的位置,比如,像 innerHTML 这样的 DOM 属性,如果处理不当,可能会导致跨站点脚本(XSS)安全错误。

因此如果在使用 [innerHTML] 指令时内部会自动将标签上的 style 属性去除掉,如下图:在这里插入图片描述
检查元素也可以看到没有 style 属性
在这里插入图片描述

解决办法

stackoverflow 这里提到了可以通过管道来将不安全的字符串转为安全的 html 代码,具体如下:

新建一个 Safe.pipe.ts 文件:

import { Pipe } from "@angular/core";
import { DomSanitizer, SafeHtml } from "@angular/platform-browser";

@Pipe({ name: 'safeHtml' })
export class Safe {
    constructor(private sanitizer: DomSanitizer) { }
	// 转为安全的html
    public transform(html: string): SafeHtml {
        return this.sanitizer.bypassSecurityTrustHtml(html);
    }
}

在你需要使用该管道的组件 Module 中声明该管道:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
import { FormsModule } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
import { Safe } from '../common/function/safe.pipe';
/**
 * 测试模块
 */
@NgModule({
    imports: [
        BrowserModule,
        HttpClientModule,
        FormsModule,
        TranslateModule
    ],
    declarations: [
        Safe
    ],
    providers: [],
    exports: []
})
export class TestModule {
}

最后在组件中使用该管道即可:

<div [innerHTML]="sentence.content | safeHtml"></div>

这样就可以成功渲染样式了:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Angular使用innerHTML指令,确实会自动移除style属性,这是因为Angular认为这样可以避免可能的XSS攻击。如果你需要在Angular使用innerHTML指令并保留style属性,可以使用以下两种方法的任何一种: 1. 使用DomSanitizer 可以使用Angular提供的DomSanitizer服务来手动信任HTML字符串。首先,在组件的构造函数注入DomSanitizer服务,然后在template使用管道来信任HTML字符串,例如: ``` import { Component } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; @Component({ selector: 'app-root', template: ` <div [innerHTML]="trustedHtml"></div> ` }) export class AppComponent { trustedHtml: any; constructor(private sanitizer: DomSanitizer) { const html = '<div style="color: red;">Hello, World!</div>'; this.trustedHtml = this.sanitizer.bypassSecurityTrustHtml(html); } } ``` 在这个例子,我们首先注入了DomSanitizer服务,然后在构造函数使用该服务的bypassSecurityTrustHtml方法来信任HTML字符串。最后,在template使用innerHTML指令和trustedHtml变量来渲染HTML。 2. 使用HostBinding 可以使用@HostBinding装饰器来绑定元素的innerHTML属性,并在组件手动设置该属性,例如: ``` import { Component, HostBinding } from '@angular/core'; @Component({ selector: 'app-root', template: ` <div [innerHTML]="html"></div> ` }) export class AppComponent { @HostBinding('innerHTML') html: any; constructor() { const html = '<div style="color: red;">Hello, World!</div>'; this.html = html; } } ``` 在这个例子,我们使用@HostBinding装饰器来绑定元素的innerHTML属性,并在构造函数手动设置该属性。这样,Angular就不会自动移除style属性了。 需要注意的是,使用innerHTML指令需要非常谨慎,因为它可能会导致XSS攻击。因此,除非你确实需要使用innerHTML指令,否则最好避免使用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值