如何编辑和呈现存储为字符串的内部 html?

Posted

技术标签:

【中文标题】如何编辑和呈现存储为字符串的内部 html?【英文标题】:How to edit and render inner html stored as a string? 【发布时间】:2018-09-22 14:37:02 【问题描述】:

我有一个来自字符串类型变量的 html sn-p。 考虑,以下语句存储为字符串类型变量,

displayContent =
    `<div>
        <img  src="image1.jpeg"/>
    </div>
    <div>
        <p>Some random text</p>
        <img  src="image2.jpeg"/>
        <p>Some random text again</p>
        <img  src="image3.jpeg"/>
        <p>Some random text</p>
    </div>`

现在,我必须在“displayContent”呈现为 html 文本的 HTML 页面中显示字符串变量“displayContent”。

我用过这个:&lt;span [innerHTML]='displayContent'&gt; 它在我的主 HTML 页面中精美地呈现了变量“displayContent”的 HTML 代码。

现在,来自某些来源的图像比我的页面尺寸大。我需要为每个&lt;img /&gt; 添加一个样式元素,例如&lt;img style="max-width: 100%" /&gt;

要实现这一点,我们可以简单地在我们的 javascript 文件中使用 replace() 作为 displayContent = displayContent.replace(/&lt;img/gi,'&lt;img style="max-width: 100%" ')

所以,我们的新“displayContent”变成了

`<div>
    <img style="max-width: 100%"  src="image1.jpeg"/>
</div>
<div>
    <p>Some random text</p>
    <img style="max-width: 100%"  src="image2.jpeg"/>
    <p>Some random text again</p>
    <img style="max-width: 100%"  src="image3.jpeg"/>
    <p>Some random text</p>
</div>`

现在,当我使用 &lt;span [innerHTML]='displayContent'&gt; 它不会以任何方式缩放我的图像。 图像仍然是原始大小。

此外,浏览器的开发人员工具中的图像样式属性没有更新。 Click here to see developer tools Styles

【问题讨论】:

正在使用...angular? 如果你使用 react 那么它将变成:style=maxWidth: "100%" 你尝试过上课吗? @jonrsharpe 是的,我正在使用 Angular。 @TheSegfault 是的,我也尝试过使用类。 【参考方案1】:

我找到了(也许)一个解决方案here。

它说我们必须清理 HTML 以应用样式。

创建一个新管道:

import  Pipe, PipeTransform  from '@angular/core';
import  DomSanitizer  from "@angular/platform-browser";
@Pipe(
  name: 'safeHtml',
)
export class SafeHtmlPipe implements PipeTransform 

  constructor(private sanitizer:DomSanitizer)

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

不要忘记在声明下将管道添加到模块中

@NgModule(
  declarations: [
    ...
    SafeHtmlPipe,
],

导入并使用:

<span [innerHTML]="displayContent | safeHtml">

【讨论】:

【参考方案2】:

您必须使用DomSanitizer[innerHTML] 绑定到SafeHtml。

import  Component  from '@angular/core';
import  DomSanitizer, SafeHtml  from '@angular/platform-browser';

@Component(
  selector: 'my-app',
  template: `
   <div [style.width.px]="300">
     <div [innerHtml]="safeHTML"></div>
   </div>
  `,
  styleUrls: ['./app.component.css']
)
export class AppComponent 
  html = '<img src="https://via.placeholder.com/1000x1000" style="max-width: 100%" />';

  get safeHTML(): SafeHtml 
    return this.sanitizer.bypassSecurityTrustHtml(this.html);
  

  constructor(private sanitizer: DomSanitizer)  

Live demo

【讨论】:

以上是关于如何编辑和呈现存储为字符串的内部 html?的主要内容,如果未能解决你的问题,请参考以下文章

如何将模板字符串呈现为 HTML?

如何将 Blazor 组件呈现为 HTML 字符串

如何将 GSP 呈现为字符串?

如何使用 Meteor Spacebars 模板动态呈现 HTML?

在 C# Razor 中将字符串呈现为 HTML

如何通过危险的HTML函数返回我的数据字符串以呈现粗体标签?