【问题标题】:HTML-encoding/decoding as it pertains to textboxes与文本框相关的 HTML 编码/解码
【发布时间】:2012-04-21 18:07:15
【问题描述】:

我正在从 Microsoft 堆栈(即 WPF)过渡到 HTML5,因此提前为这个问题相当业余的性质道歉。

手头的主题是 HTML 编码和解码。

假设一个 HTML5 应用通过 HTTP 对 C# 后端进行 AJAX 调用。服务器仅返回 JSON 格式的数据,始终确保使用 HttpUtility.HTMLEncode() 对 JSON 值字段进行 HTML 编码。

HTML5 客户端反向执行相同的过程。发布到服务器的所有数据首先使用简单的 JavaScript 辅助函数进行 HTML 解码。

我的 HTML5 应用程序中所有可能显示的字符串数据都以 HTML 编码的形式存储和传递。这个方案对我来说效果很好。但是今天我发现了 HTML5 文本框,并在这样做的过程中发现了一些奇怪的东西。文本框似乎不喜欢编码文本。

如果我有一个这样定义的文本框:

<input id="festus" type="text"/>

并更新如下:

$("#festus").val(someEncodedString)

...文本框显示嵌入到 someEncodedString 中的实际代码,而不是将这些代码转换为适当的字符。我对这种行为感到惊讶,因为我假设浏览器对所有 DOM 元素执行正确的转义码解释。

我试图通过为 val() 编写一个名为 val2() 的帮助器/包装器来抽象出问题:

$.prototype.val2=function(newVal){
    return (newVal===undefined)
        ?iHub.Utils.encodeHTML(this.val())      //getting value
        :this.val(iHub.Utils.decodeHTML(newVal));   //setting value
}

[iHub.Utils 是我编写的辅助函数库]

这里的想法是 val2() 将在 获取 值时对从我的文本框中检索到的数据进行适当的编码,并在 设置 值之前对其进行解码。这似乎可行,但我无法摆脱我对 HTML5 中编码/解码应该如何工作的基本误解。

使用文本框时对数据进行编码/解码是标准做法吗?与&lt;p&gt;&lt;select&gt; 等其他常见元素不同,文本框是否特殊,在显示编码输入字符串时不执行标准解码?

再次,抱歉,如果这太基本了。 HTML5 和 JavaScript 对我来说相当新,我的“HTML5 简介”类书籍并没有真正深入讨论这个主题。

【问题讨论】:

  • 您的文本框值将显示您告诉它的任何原始文本。但是,如果您希望在 div 中解释您的 HTML,例如,您可以使用 $("#target_id").html("&lt;b&gt;bold text&lt;/b&gt;");。标准文本框并没有真正将 HTML 包含在里面,所以我不清楚你想要实现什么。
  • 签出这个fiddle...这是你想做的吗?
  • 文本框显示原始文本。它们不显示呈现的 HTML。这与 Ajax、Json 或其他任何东西无关。浏览器只会显示您放入其中的任何文本。这是标准的浏览器。目前尚不清楚您到底想要什么。您能否举例说明数据以及您希望它如何显示?

标签: javascript jquery html encoding textbox


【解决方案1】:

HTML 编码适用于 HTML 文档。如果您将值包含在 HTML 文档本身中,例如&lt;input value="10 &amp;gt; 5" /&gt;,您需要对其进行编码,以确保您的值中的 &gt; 之类的内容不会与关闭标签的 &gt; 混淆。

但是,当您使用 JavaScript 设置字段的值时,就没有混淆的余地了。您没有修改 &lt;input.../&gt; 之类的标签;您正在修改一个 JavaScript 对象。所以你不应该对值进行 HTML 编码。如果您使用的是字符串变量,就像在您的示例中一样,则根本不需要进行任何编码。

另一方面,如果您使用字符串文字来指定值,则需要将其编码为 JavaScript 字符串,例如通过转义 $("#festus").val('can\'t') 中的 '。这与您进行 HTML 编码的原因完全相同;以避免与关闭字符串的' 混淆。

您在 JavaScript 中进行 HTML 编码的唯一时间是当您使用它来生成 HTML 代码时,例如el.innerHTML = '&lt;input value="10 &amp;gt; 5" /&gt;';.

因此,我建议您在 AJAX 响应或请求中不要对字符串进行 HTML 编码。相反,在您真正生成需要编码的代码之前,请避免编码。因此,在编写 HTML 时仅对字符串进行 HTML 编码,在编写 JavaScript 时仅对字符串进行 JavaScript 编码,等等。

【讨论】:

  • 感谢您的回答。这里有很多值得思考的好东西——正是我想要的。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
相关资源
最近更新 更多