2016-09-13 3 views
4

Я получаю от содержания сервера в поле объекта JSON, где это HTML, <style></style> и <script></script> теги, и я хочу, чтобы выполнить это следующим образом:Angular2 динамически вставить скрипт тег

[innerHtml] = "содержание | sanitize ", но <script></script> теги не выполняются. Можно ли заставить его работать?

Моя Sanitize труба выглядит следующим образом:

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); 
    } 
} 

Я знаю, что есть bypassSecurityTrustScript функция DomSanitizationService, но как я могу использовать это в моем случае?

+0

Как выглядит объект json? что вы хотите преобразовать? – micronyks

+0

Добавлен ли 'html' в DOM? Получаете ли вы сообщения об ошибках в консоли браузера? –

+0

содержания выглядит следующим образом: «

some html
некоторые код» –

ответ

13

Это не проблема с угловым 2, script теги, вставленные через innerHTML, не выполняются.

Если у вас есть HTML строка, содержащие теги script вставить его таким образом:

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

Работал отлично – niravpatel9898

+0

Для других, которым может понадобиться добавить скрипт к телу в какой-то момент, но намеренно не хотите, чтобы он загружался при начальной загрузке страницы с остальной частью приложения: 'document.body.appendChild (фрагмент)' мог также работайте над второй строкой кода Алекса, а не создавайте ViewChild в Angular. – 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; 
    } 
} 
Смежные вопросы