2

ページに 20 個のフィールドを持つポップアップ ダイアログがあります。20 個のフィールドを変更することができ、ダイアログへの変更はサーバーに更新されます。

nullIE8 でのみ、ユーザーがフィールドをクリアしてコンテンツを保存しようとすると、フィールド値が に設定されます。

IE8 のネイティブ関数を使用しての DOM 要素の値をシリアライズすると、代わりに (string)が返されたようです。JSON.stringfy"null"""

デモ: http://jsfiddle.net/6VKzy/2/ [IE8 で開く]

ブログからの問題の詳細については、

IE8 で有効になっているネイティブ JSON サポートにより、ユーザーは組み込みの JSON.stringify メソッドと JSON.parse メソッドを利用して、JScript 値を JSON テキストにシリアライズおよびデシリアライズしたり、その逆を行ったりできるようになりました。ただし、IE8 のネイティブ JSON 実装には既知の問題があり、ユーザーが空の DOM 要素の値を読み取り、ネイティブ JSON を使用して同じ値をシリアル化しようとすると、シリアル化中にユーザーが期待する結果とは異なります」 " .

http://blogs.msdn.com/b/jscript/archive/2009/06/23/serializing-the-value-of-empty-dom-elements-using-native-json-in-ie8.aspx

注:この質問は自己回答です。

4

1 に答える 1

4

修正は、以下のような censor 関数を使用して、 の""代わりに返すことです"null"

function(k, v) { return v === "" ? "" : v }

修正されたデモ: http://jsfiddle.net/6VKzy/3/ [IE8 で開いて修正を確認]

ブログでの修正の詳細とさまざまなアプローチ、

これは、IE8 の製品版のバグです。ここでの問題は、DOM 内で欠落した文字列値を表すために特別なエンコーディングが使用されていることです。この特別な値は JScript リテラル "" のエンコーディングとは異なりますが、JScript の実装全体を通して、値は JSON.stringify の特定のケースを除いて === から "" として扱われます。

この特別な値は DOM オブジェクトへのアクセスからのみ発生するため、回避策は、DOM オブジェクトを返す可能性のあるすべての DOM アクセスでそれらを明示的に検閲することです。

http://blogs.msdn.com/b/jscript/archive/2009/06/23/serializing-the-value-of-empty-dom-elements-using-native-json-in-ie8.aspx

于 2012-12-12T23:00:04.790 に答える