Javascript 与文本框相关的HTML编码/解码

Javascript 与文本框相关的HTML编码/解码,javascript,jquery,html,encoding,textbox,Javascript,Jquery,Html,Encoding,Textbox,我正在从微软的堆栈(即WPF)过渡到HTML5,所以我为这个问题的业余性质提前道歉 目前的主题是HTML编码和解码 考虑一个HTML5应用程序通过HTTP对C#后端进行AJAX调用。服务器以独占方式返回JSON格式的数据,始终确保使用HttpUtility.HTMLEncode()对JSON值字段进行HTML编码 HTML5客户端反向执行相同的过程。发布到服务器的所有数据首先使用简单的JavaScript帮助函数进行HTML解码 我的HTML5应用程序中所有可能显示的字符串数据都以HTML编码的

我正在从微软的堆栈(即WPF)过渡到HTML5,所以我为这个问题的业余性质提前道歉

目前的主题是HTML编码和解码

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

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

我的HTML5应用程序中所有可能显示的字符串数据都以HTML编码的形式存储并从一个地方传递到另一个地方。这个计划对我很有效。但今天我发现了HTML5文本框,在这样做的过程中,我注意到了一些奇怪的事情。文本框似乎不喜欢编码文本

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

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

我试图通过为val()编写一个名为val2()的helper/wrapper来抽象出这个问题:

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

这里的想法是,val2()将在获取值时对从文本框检索到的数据进行适当编码,并在设置值之前对其进行解码。这似乎是可行的,但我无法摆脱这样一种感觉:我一定对HTML5中编码/解码的工作原理有一个根本性的误解

使用文本框时对数据进行编码/解码是标准做法吗?文本框与其他常见元素(如
)不同,它们在显示编码输入字符串时不执行标准解码,这是不是有点特殊


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

HTML编码是针对HTML文档的。如果将值包含在HTML文档本身中,例如
,则需要对其进行编码,以确保值中的
等内容不会与关闭标记的
相混淆

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

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

在JavaScript中进行HTML编码的唯一时间是在使用它生成HTML代码时,例如,
el.innerHTML=''


因此,我建议您不要在AJAX响应或请求中对字符串进行HTML编码。相反,在实际生成需要编码的代码之前,请避免编码。因此,当您编写HTML时,只有HTML编码字符串,当您编写JavaScript时,只有JavaScript编码字符串,依此类推。

HTML编码用于HTML文档。如果将值包含在HTML文档本身中,例如
,则需要对其进行编码,以确保值中的
等内容不会与关闭标记的
相混淆

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

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

在JavaScript中进行HTML编码的唯一时间是在使用它生成HTML代码时,例如,
el.innerHTML=''


因此,我建议您不要在AJAX响应或请求中对字符串进行HTML编码。相反,在实际生成需要编码的代码之前,请避免编码。因此,当您编写HTML时,只有HTML编码字符串,当您编写JavaScript时,只有JavaScript编码字符串,依此类推。

您的文本框值将显示您告诉它的任何原始文本。但是,如果您希望在
div
中解释HTML,则可以使用
$(“#target_id”).HTML(“粗体文本”)。标准文本框实际上并不包含HTML,所以我不清楚您想要实现什么。。。这就是您想要做的吗?文本框显示原始文本。它们不显示呈现的HTML。这与Ajax、Json或其他任何东西无关。浏览器只显示您在其中输入的任何文本。这是一个标准的浏览器。你到底想要什么还不清楚。您能给出一个数据的exmaple以及您希望它如何显示吗?您的文本框值将显示您告诉它的任何原始文本。但是,如果您希望在
div
中解释HTML,则可以使用
$(“#target_id”).HTML(“粗体文本”)。标准文本框实际上并不包含HTML,所以我不清楚它们是什么
$("#festus").val(someEncodedString)
$.prototype.val2=function(newVal){
    return (newVal===undefined)
        ?iHub.Utils.encodeHTML(this.val())      //getting value
        :this.val(iHub.Utils.decodeHTML(newVal));   //setting value
}