【问题标题】:How to contain styles injected with innerHTML to the DOM element and its children?如何将使用 innerHTML 注入的样式包含到 DOM 元素及其子元素中?
【发布时间】:2018-05-18 17:49:40
【问题描述】:

我有一个从第三方获取的 HTML 页面。

问题是 HTML 在样式标签中带有 CSS。 CSS 是一种通用的,他们在正文上添加自己的字体和自己的字体大小。

我正在使用带有 bypassSecurityTrustHtml 的 dom sanitizer 在我的应用程序上显示 HTML。

this.domSanitizer.bypassSecurityTrustHtml(htmldata);

现在添加新的 HTML 后,我的应用程序样式因此受到影响。除了在 iframe 中添加第三方 URL 之外,我该如何避免这种情况?

【问题讨论】:

  • 你需要保留他们所有的风格吗?为什么不在注入 html 之前从 html 中去除不必要的样式(例如 body 样式)?
  • 您的应用程序中究竟被覆盖了什么?您可以尝试更改应用程序中的类名,以免它们与 3rd 方 html 冲突。如果他们没有很好地命名他们的 css,你就无能为力了。

标签: html css angular angular-dom-sanitizer


【解决方案1】:

您正在寻找ViewEncapsulation.Native。您将需要创建一个自定义组件,该组件仅包含您要注入 innerHTML 的 DOM 元素。

将此 ViewEncapsulation 设置为 Native 意味着它会创建 Shadow DOM,并确保它成为父元素,并且所有样式和 DOM 引用都包含在其自身中。

将 ViewEncapsulation 设置为 Native 的示例。你可以在这里提供你的 DOM 和 innerHTML 注入:

import { Component, OnInit } from '@angular/core';
import { ViewEncapsulation } from '@angular/core';
@Component({
  selector: 'app-my',
  templateUrl: './my.component.html',
   styles: [
    `h1 {
      color: #367;
      font-family: Arial, Helvetica, sans-serif;
      font-size: 250%;
    }
  `],
   encapsulation: ViewEncapsulation.Native
})
export class MyComponent implements OnInit {
  constructor() { }
  ngOnInit() {
  }
}

【讨论】:

  • 是的,这行得通。但 IE 11 也不支持它。这现在给我带来了问题
  • @Nitish 100% 浏览器支持使用 es6 polyfills 的原生 Angular 项目:angular.io/guide/browser-support
  • 谢谢现在检查,但我看到了这个github.com/angular/angular/issues/6531
  • @Nitish 现在包括在内,这个问题在大约 2 年前推出 Beta 版时得到了解决。
  • 我已经为 IE 启用了所有的 polyfill。所有 core-js、classlist、core-js/es6/reflect、core-js/es7/reflect、zone.js/dist/zone。但它仍然存在
猜你喜欢
  • 2010-12-17
  • 2021-08-28
  • 1970-01-01
  • 2021-11-24
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多