2016-09-13 8 views
4

私はそれは、HTML、<style></style><script></script>タグであるJSONオブジェクトフィールドへのサーバのコンテンツから取得しています、と私はこのようにそれを実行したい:Angular2動的に挿入するスクリプトタグ

[innerHTMLプロパティ] = "コンテンツ|サニタイズ "しますが、<script></script>タグは実行されません。それを動作させることは可能ですか?

私のサニタイズパイプは次のようになります。

import {Pipe} from '@angular/core'; 
import {DomSanitizationService} from '@angular/platform-browser'; 

@Pipe({ 
    name: 'sanitize', 
    pure: true 
}) 
export class Sanitize { 
    constructor(private sanitizer: DomSanitizationService) { 

    } 

    transform(html: string) { 

     return this.sanitizer.bypassSecurityTrustHtml(html); 
    } 
} 

私はDomSanitizationServiceでbypassSecurityTrustScript機能があることを、知っているが、どのように私は私の場合にはそれを使用することができますか?

+0

jsonオブジェクトはどのように見えますか?あなたは何を変換したいですか? – micronyks

+0

'html'はDOMに追加されていますか?ブラウザのコンソールにエラーメッセージが表示されますか? –

+0

内容は次のようになります。「

some html
」 –

答えて

13

角度2の問題ではありません。script innerHTMLで挿入されたタグは実行されません。

あなたがscriptのタグを含むHTML文字列を持っている場合は、このようにそれを挿入します。

const fragment = document.createRange().createContextualFragment(yourHtmlString); 
anyElement.appendChild(fragment); 
+0

完全に作業しました – niravpatel9898

+0

ある時点で本体にスクリプトを追加する必要があるかもしれないが、意図的にアプリケーションの初期ページロード時にブートストラップしないようにしたい場合は、 'document.body.appendChild(fragment)' ViewChildをAngularで設定するのではなく、Alexのコードの2行目でも動作します。 – jmq

0

...あなたはこのようにそれを行うために必要な一切の角度方法はありません....

import { Pipe } from '@angular/core'; 
import { DomSanitizer } from '@angular/platform-browser'; 

@Pipe({ 
    name: 'sanitize', 
    pure: true 
}) 
export class Sanitize { 

    constructor(private domSanitizer: DomSanitizer) { } 


    handleExternalScriptsInHtmlString(string) { 
    let that = this; 
    var parser = new DOMParser(); 
    var scripts = parser.parseFromString(string, 'text/html').getElementsByTagName('script'); 
    var results = []; 

    for (var i = 0; i < scripts.length; i++) { 
     var src = scripts[i].getAttribute('src'); 
     if (src.length && results.indexOf(src) === -1) { 
     results.push(src); 
     that.addScript(src); 
     } 
    } 

    return results; 
    } 

    addScript(src) { 
    var script = document.createElement('script'); 
    script.setAttribute('src', src); 
    document.body.appendChild(script); 
    } 


    transform(htmlContent: any) { 
    let sanitizeHtmlContent = this.domSanitizer.bypassSecurityTrustHtml(htmlContent); 

    this.handleExternalScriptsInHtmlString(htmlContent); 

    return sanitizeHtmlContent; 
    } 
} 
0

これは問題を解決します...

import { Pipe } from '@angular/core'; 
import { DomSanitizer } from '@angular/platform-browser'; 

@Pipe({ 
    name: 'sanitize', 
    pure: true 
}) 
export class Sanitize { 

    constructor(private domSanitizer: DomSanitizer) { } 


    handleExternalScriptsInHtmlString(string) { 
    let that = this; 
    var parser = new DOMParser(); 
    var scripts = parser.parseFromString(string, 'text/html').getElementsByTagName('script'); 
    var results = []; 

    for (var i = 0; i < scripts.length; i++) { 
     var src = scripts[i].getAttribute('src'); 
     if (src.length && results.indexOf(src) === -1) { 
     results.push(src); 
     that.addScript(src); 
     } 
    } 

    return results; 
    } 

    addScript(src) { 
    var script = document.createElement('script'); 
    script.setAttribute('src', src); 
    document.body.appendChild(script); 
    } 


    transform(htmlContent: any) { 
    let sanitizeHtmlContent = this.domSanitizer.bypassSecurityTrustHtml(htmlContent); 

    this.handleExternalScriptsInHtmlString(htmlContent); 

    return sanitizeHtmlContent; 
    } 
} 
関連する問題