2012-04-21 32 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