2017-12-13 1 views
0

Ich bin mit einem WYSIWYG-Editor (CKEditor) und versuchen, den Inhalt mit kantigem 5.Angular 5 DomSanitizer mit Hyperlinks

zu machen Was ich versuche, ist der richtige Weg, um herauszufinden, DomSanitizer in Angular 5. verwenden Problem, mit dem ich konfrontiert bin, ist, dass Hyperlinks nicht funktionieren (sind nicht "anklickbar") in der resultierenden hygienisierten HTML.

ich folgenden Typoskript Code bin mit einem Safehtml Inhalt zurück:

public getSafeContent(): SafeHtml { 
    return this.sanitizer.bypassSecurityTrustHtml(this.page.content); 
} 

und es in meiner Vorlage auf diese Weise mit:

<div [innerHTML]="getSafeContent()"></div> 

Dies wird die HTML mit alle Inline-Styles macht intakt , aber Hyperlinks funktionieren nicht.

Ich habe versucht, diese stattdessen tun:

public getSafeContent(): SafeHtml { 
    return this.sanitizer.sanitize(SecurityContext.HTML, this.page.content); 
} 

, die in dieser Hyperlinks führt tatsächlich funktioniert, aber inlines Stile sind nicht.

Gibt es eine Möglichkeit, beide Stile und Hyperlinks für die Verwendung von gesäuberten Inhalten zu verwenden?

aktualisiert

Dies ist, was die Seite wie in Chrome Entwickler-Tool aussieht:

<div _ngcontent-c22="" class="row"> 
    <div _ngcontent-c22="" class="col-lg-12"> 

     <div _ngcontent-c22=""> 
      <p><a href="http://www.google.com">google</a></p> 
     </div> 
    </div> 
</div> 

und die Google-Verbindung ist nicht anklickbar.

+0

Welche Hyperlinks? Wie sieht der Kontext aus? –

+0

Haben Sie [bypassSecurityTrustHtml] (https://angular.io/api/platform-browser/DomSanitizer#bypassSecurityTrustHtml) anstelle von 'sanitize()' ausprobiert? –

+0

typischen Kontext, der nicht funktioniert, ist:

google

und ja, ich habe versucht, bypassSecurityTrustHtml – user2845798

Antwort

0

bypassSecurityTrustHtml ermöglicht <script> Tags im Inhalt. Für URLs benötigen Sie bypassSecurityTrustUrl. Siehe hier: https://angular.io/api/platform-browser/DomSanitizer#bypassSecurityTrustUrl.

Ich habe nie versucht, die bypassXXX Methoden stapelt, so dass ich weiß nicht, ob Sie so etwas wie diese bypassSecurityTrustUrl(bypassSecurityTrustHtml(myContent)) tun können, aber ich würde vermuten, wahrscheinlich nicht, da jede Methode einen String, sondern gibt ein Objekt (vom Typ SafeHtml/SafeUrl), Daher kann es nicht als Eingabe für den Stapelfunktionsaufruf verwendet werden, der eine Zeichenfolge erwartet.

Also, Sie müssen möglicherweise den Inhalt analysieren, übergeben Sie jede URL in die bypassSecurityTrustUrl und dann alles wieder zusammen zu kombinieren.

aktualisieren

ich am sanitize Methode nur an. Ich habe nicht versucht, aber so etwas wie dies funktionieren könnte:

this.sanitizer.sanitize(SecurityContext.HTML, this.sanitizer.bypassSecurityTrustUrl(myContent)); 

seit sanitize ein SafeValue als eine Eingabe erfolgen kann. Der innere bypassSecurityTrustUrl bereinigt die URLs und gibt eine SafeUrl zurück, die von der äußeren Bereinigung ausgepackt und als Eingabe verwendet wird, um HTML-sicher zu machen. Wie ich schon sagte, ich habe es nicht versucht, aber es sieht in der Theorie gut aus ...

+0

bypassSecurityTrustUrl() wird sich beschweren, wenn es HTML-Tags hat, daher konnte ich nicht den gesamten Inhalt an diese Funktion übergeben. Wenn ich nur die URLs extrahiere und sie zum Inhalt hinzufüge, funktioniert es. Wenn ich diese Funktion direkt verwende: this.sanitizer.sanitize (SecurityContext.HTML, myContent); Links funktionieren, aber Inline-Stile werden gelöscht. – user2845798

+0

Hier konnte kein Code eingegeben werden ...? Eine andere Antwort hinzugefügt ... – TimTheEnchanter

0

Dies funktioniert für mich:

Komponente:

content = '<b>Hello World</b><p style=\'font-size:14pt\'> 
<a href=\'http://www.google.com\'>Go to Google</a></p>Test123'; 

public getSafeContent(): SafeHtml { 
    return this.sanitizer.bypassSecurityTrustHtml(this.content); 
} 

HTML:

<div [innerHTML]="getSafeContent()"></div> 

Link funktioniert und Inline-Styles sind intakt

+0

Ich habe gerade dein Beispiel getestet und der Link funktioniert nicht für mich, indem ich einfach darauf klicke. Es funktioniert, wenn ich mit der rechten Maustaste klicke und in einem neuen Tab öffne, aber nicht mit der linken Maustaste klicke. Wenn ich denselben HTML-Code direkt in die Vorlage einfüge, funktioniert die Verknüpfung wie erwartet. Welche eckige Version verwendest du? Ich betreibe 5.1.1. – user2845798