【问题标题】:Angular render dynamiclly appended <script>-tag in component [duplicate]角度渲染在组件中动态附加 <script>-tag [重复]
【发布时间】:2018-05-31 22:42:24
【问题描述】:

我试图在 Angular 组件 DOM 中注入 HTML 模板。这些 HTML 模板包含一个 &lt;div&gt;-tag 和 &lt;script&gt;-tag。

模板.html

<div>Some Text</div>
<script>(function() { alert("I am here!"); })()</script>

当我在TestComponent 中使用纯角度来执行此操作时。

test-comp.component.ts

@Component({
  selector: "[test-comp]",
  templateUrl: "./test-comp.component.html",
  styleUrls: ["./test-comp.component.css"]
})
export class TestComponent implements OnInit {
  private _snippet: SafeHtml;

  get snippet(): SafeHtml { return this._snippet; }

  constructor(
    private domSanitizer: DomSanitizer
  ) {}

  ngOnInit() {
    const template: string = require("module/dist/template.html");
    this._snippet = this.domSanitizer.bypassSecurityTrustHtml(template);
  }
}

组件 HTML 看起来像:

test-comp.component.html

<div id="some_id" [innerHTML]="snippets"></div>

这将在 DOM 中正确注入模板,但 &lt;script&gt;-tag 不会被实现,也不会发出任何警报。

如果我使用 jQuery 将相同的模板注入到相同的组件中,那么&lt;script&gt;-tag 将被实现并提醒文本。

test-comp.component.ts

@Component({
  selector: "[test-comp]",
  templateUrl: "./test-comp.component.html",
  styleUrls: ["./test-comp.component.css"]
})
export class TestComponent implements OnInit {
  constructor(
  ) {}

  ngOnInit() {
    const template: string = require("module/dist/template.html");
    $("#some_id").after(template);
  }
}

对这种现象有什么解释吗?我有兴趣知道区别!以及为什么 jQuery 有效?

注意:我的问题与 question 没有重复,因为有人标记了它,因为我在问:为什么它用 jQuery 渲染而不是渲染与domSanitizer。我不是在问:如何做到这一点?

【问题讨论】:

    标签: javascript jquery angular


    【解决方案1】:

    Angular.io - HTML 是 Angular 模板的语言。几乎所有的 HTML 语法都是有效的模板语法。该元素是一个明显的例外;禁止,消除脚本注入攻击的风险。在实践中, 被忽略并在浏览器控制台中出现警告。详情请参阅Security 页面。


    但是,您可以使用以下方法绕过安全性:DomSanitizer

    【讨论】:

    • 我正在这样做this.domSanitizer.bypassSecurityTrustHtml(template),但它仍然不起作用!你是这个意思吗?
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 2022-10-14
    • 2020-02-19
    • 1970-01-01
    • 2021-03-05
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多