1

私はMicrosoftスタック(つまりWPF)からHTML5に移行しているので、この質問のかなりアマチュア的な性質について事前に謝罪します。

当面のトピックは、HTMLのエンコードとデコードです。

HTTP経由でC#バックエンドにAJAX呼び出しを行うHTML5アプリについて考えてみます。サーバーはJSON形式のデータを排他的に返し、常にを使用してJSON値フィールドをHTMLエンコードするようにしますHttpUtility.HTMLEncode()

HTML5クライアントは、同じプロセスを逆に実行します。サーバーに投稿されたすべてのデータは、最初に単純なJavaScriptヘルパー関数を使用してHTMLでデコードされます。

HTML5アプリで表示される可能性のあるすべての文字列データは、HTMLエンコードされた形式で保存され、場所から場所へと渡されます。このスキームは私にとってうまく機能しています。しかし、今日、私はHTML5テキストボックスを発見しました。そうすることで、何か奇妙なことに気づきました。テキストボックスは、エンコードされたテキストを好まないようです。

そのように定義されたテキストボックスがある場合:

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

次のように更新します。

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

…テキストボックスには、コードを適切な文字に変換する代わりに、someEncodedStringに埋め込まれている実際のコードが表示されます。ブラウザがすべてのDOM要素に対して適切なエスケープコードの解釈を実行すると想定したため、この動作に驚きました。

val2()と呼ばれるval()のヘルパー/ラッパーを作成して、問題を抽象化しようとしました。

$.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でエンコード/デコードがどのように機能するかについて根本的な誤解を持っている必要があるという感覚を揺るがすことはできません。

テキストボックスを使用するときにデータをエンコード/デコードするのは標準的な方法ですか?<p>テキストボックスは、やなどの他の一般的な要素とは異なり<select>、エンコードされた入力文字列を表示するときに標準のデコードを実行しない限り、何らかの形で特別ですか?

繰り返しますが、これが基本的すぎる場合は申し訳ありません。HTML5とJavaScriptは私にとってかなり新しいものであり、私の「HTML5入門」タイプの本では、このトピックについて詳しく説明していません。

4

1 に答える 1

5

HTMLエンコーディングはHTMLドキュメント用です。HTMLドキュメント自体に値を含める場合、たとえば<input value="10 &gt; 5" />、値をエンコードして、値のようなものがタグを閉じるもの>と混同されないようにします。>

ただし、JavaScriptを使用してフィールドの値を設定する場合、混乱する余地はありません。<input.../>;のようなタグを変更していません。JavaScriptオブジェクトを変更しています。したがって、値をHTMLエンコードしないでください。例のように文字列変数を使用している場合は、エンコードを行う必要はまったくありません。

一方、文字列リテラルを使用して値を指定している場合は、たとえばinをエスケープして、JavaScript文字列としてエンコードする必要があり'ます$("#festus").val('can\'t')。これは、HTMLエンコーディングを行う理由とまったく同じです。'文字列を閉じるとの混同を避けるため。

JavaScriptでHTMLエンコードを行うのは、JavaScriptを使用してHTMLコードを生成するときだけですel.innerHTML = '<input value="10 &gt; 5" />';

このため、AJAXの応答または要求で文字列をHTMLエンコードしないことをお勧めします。代わりに、エンコードを必要とする種類のコードを実際に生成するまで、エンコードを避けてください。したがって、HTMLを記述している場合はHTMLエンコード文字列のみ、JavaScriptを記述している場合はJavaScriptエンコード文字列のみなどです。

于 2012-04-21T19:16:58.323 に答える