【问题标题】:Encoding/decoding issue of a string in HTML5HTML5中字符串的编码/解码问题
【发布时间】:2019-10-23 23:21:44
【问题描述】:

我试图在 HTML 浏览器中显示下面的字符串,但是当浏览器在字符串中遇到像“”这样的自定义标签时,它只是跳过了那个。

我尝试了 encodeURIComponent(),后来又尝试在我的 HTML 模板中 decodeURIComponent,但没有成功。

我什至尝试通过创建如下所示的 PIPE 来清理 HTML,但没有成功。

transform(v: string): SafeHtml {
        return this._sanitizer.bypassSecurityTrustHtml(v);
    }

不知何故,浏览器正在跳过字符串中的元素。

后面是字符串

“The endpoint is browser-based, rather than RESTful. Therefore it could 
     result in the following different scenarios,↵1. SUCCESS 
    (response_type=code)↵> redirect_uri?code=<authorization-code>&scope= 
    <resource-owner-approved-scopes>[&state=<state-provided-by-the-client>]."

【问题讨论】:

  • 使用 ' ' 而不是 ' " '?也许这可以帮助你:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 你想用这个字符串做什么?将其插入innerHTML 属性,也许?
  • 您的意思是将字符串放在反引号而不是双引号之间。我正在从服务器获取此字符串。
  • @jacob 是的,我正在使用 innerHTML 将其插入到 div 中。
  • 您的报价不匹配。

标签: javascript html typescript decode encode


【解决方案1】:

永远不要用innerHTML 插入文本;仅插入带有innerHTMLHTML

现在的浏览器有一个textContent 属性:

yourDiv.textContent = stringFromServer;

另外,为了澄清您和许多其他开发人员所犯的常见错误,encodeURIComponent 旨在将字符串编码为插入到 URL,而不是插入到 HTML时间>。 encodeURI 也是如此(你可能永远不应该使用它)。

更新

正如您的 cmets 中所述,您实际上希望使用一些规则将文本转换为 HTML,而不是在 HTML 中插入纯文本,这将执行典型的空白规范化规则。

对此有很多选择。这里有两个:

  1. 仍然只插入纯文本,但将容器中的 CSS 样式设置为 white-space: pre。这会改变空格的呈现方式,因此换行符会导致换行。
  2. 拆分原始字符串,然后在 div 中穿插文本节点和 &lt;br/&gt; 元素。

后者的代码可能如下所示:

function insertFormattedText(container, text) {
  const chunks = text.split('\n');
  chunks.forEach((chunk, i) => {
    container.appendChild(document.createTextNode(chunk));
    if (i < chunks.length - 1) {
      container.appendChild(document.createElement('br'));
      // Equivalent of `&nbsp;&nbsp;`
      container.appendChild(document.createTextNode('\u00A0\u00A0'));
    }
  });
}

【讨论】:

  • 实际上我只是将它显示为 HTML。我从服务器获得的这个字符串。比我用“
     nbsp;”替换“↵”换行符使其看起来对齐和可读。但是如果我使用 textContent 属性,它会将所有内容显示为文本并且不适用任何格式。
  • 所以你不想真正编码字符串,而是transform成HTML。将添加到我的答案中。
  • 我正在做类似的事情。我正在使用 Regex 而不是这样的 js 函数; obj.description = obj.description.replace(/(\r\n|\n|\r)/gm, "
      ");但这会忽略字符串中的元素(如 )以在浏览器上呈现。请让我知道,如果你明白我的意思,否则我可以添加渲染内容的图像
  • 问题在于您只是将字符串的 一些 转换为有效的 HTML。转换其余部分的规则很复杂。让 DOM 完成编码字符串的繁琐工作要容易得多。如果您想采用我的方法,您可以使用该正则表达式执行.split
  • 我想知道,有没有办法把这种类型的字符串放在 下。或 <pre> 因为浏览器以这种奇怪的方式对待它们。</pre>
猜你喜欢
  • 2011-09-22
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2019-07-14
  • 2011-01-24
相关资源
最近更新 更多