2012-04-21 53 views
0

我正在从Microsoft堆栈(即WPF)转换到HTML5,因此事先对这个问题的相当业余性质表示道歉。因为它与文本框有关的HTML编码/解码

手头的主题是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是我写的辅助函数库]

这里的想法是,值2()将相应地进行编码时越来越值从我的文本框检索到的数据,在此之前设置值解码。这似乎工作,但我不能动摇的感觉,我必须有一个根本的错误理解如何编码/解码应该在HTML5中工作。

在使用文本框时编码/解码数据是标准做法吗?文本框在某种程度上是特别的,只要它们不像其他常见元素(如<p><select>)在显示编码输入字符串时不执行标准解码?

再一次,对不起,如果这太基本了。对我而言,HTML5和JavaScript是相当新的,我的“HTML5入门”类型的书籍并没有深入讨论这个话题。

+0

您的文本框的值将显示您告诉它的任何原始文本。例如,如果你想要在'div'中解释你的HTML,你可以使用'$(“#target_id”)。html(“粗体文本”);'。标准的文本框并不真正把HTML放在里面,所以我不清楚你想要实现什么。 – Marc 2012-04-21 18:40:29

+0

结帐this [fiddle](http://jsfiddle.net/MTWDU/)...这是你想要做的吗? – 2012-04-21 18:45:35

+0

文本框显示原始文本。他们不显示呈现的HTML。这与Ajax,Json或其他任何东西无关。浏览器只显示你放入的任何文本。这是一个标准的浏览器的东西。目前还不清楚你到底想要什么。你能给出一个数据的例子,你想如何显示? – 2012-04-21 19:02:08

回答

3

HTML编码用于HTML文档。如果您将自己的价值包含在HTML文档中,例如<input value="10 &gt; 5" />,你可以对它进行编码,以确保你的值中的>等东西不会与关闭标签的>混淆。

但是,当您使用JavaScript设置字段的值时,没有混淆的余地。你并没有修改标签,如<input.../>;你正在修改一个JavaScript对象。所以你不应该对这个值进行HTML编码。如果您使用的是字符串变量,就像您的示例一样,您根本不需要进行任何编码。另一方面,如果您使用字符串文字来指定值,则需要将其编码为JavaScript字符串,例如,通过在$("#festus").val('can\'t')中转义'。这与您进行HTML编码的原因完全相同;以避免与关闭字符串的'混淆。

您唯一需要在JavaScript中进行HTML编码的时候就是当您使用它来生成HTML代码时。 el.innerHTML = '<input value="10 &gt; 5" />';

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

+0

感谢您的回答。这里有很多很棒的食物 - 正是我所期待的。 – 2012-04-21 20:11:08