5

単一ページのAJAXアプリケーションを構築していますが、特定の状況下で、URLハッシュ(#)の後にJSONで状態を保存したいと考えています。他のいくつかのサイトがこれを行っているのを見てきましたが、これを実装するために作業するときに、いくつかのベストプラクティス、ヒント、または落とし穴を取得したいと思っています。

4

2 に答える 2

8

実際には、データをjsonにカプセル化してから、ハッシュに入れることはお勧めしません。その理由は、JSON自体に多くのマークアップが必要であり、後でユーザーから直接取得したコードを評価する必要があるため、実際にはいくつかのセキュリティホールが開かれるためです。

より良い代替手段として、カプセル化としてx-www-form-urlencodedを使用することをお勧めします。たとえば、これが状態オブジェクトの場合:

var stateObject = {
  userName: 'John Doe',
  age: 31
}

次に、次のようなハッシュフラグメントを作成します。

// Create an array to build the output string.
var hashPartBuffer = [];
for (var k in stateObject) {
  hashPartBuffer.push(
    encodeURIComponent(k),
    '=',
    encodeURIComponent(stateObject[k]),
    '&'); 
}
if (hashPartBuffer.length) {
  // Remove the last element from the string buffer
  // which is '&'.
  hashPartBuffer.pop();
}
var hashPartString = hashPartBuffer.join('');
// This will now be 'userName=John%20Doe&age=31'

次に、これを次のように解析します。

var hashPartString = 'userName=John%20Doe&age=31';
var pairs = hashPartString.split(/&/);
var stateObject = {};
for (var i = 0; i < pairs.length; i++) {
  var keyValue = pairs.split(/=/);
  // Validate that this has the right structure.
  if (keyValue.length == 2) {
    stateObject[keyValue[0]] = keyValue[1];
  }
}
于 2011-03-18T20:29:15.293 に答える
5

私自身の質問に答えるために戻ってきました-URLエンコード(部分的にでも)JSON文字列が本番環境で完全に正常に機能していることを証明できます。

元。ソースJSON:

{"mode":21,"popup":18,"windowId":2}

元。URLでエンコード:

http://example.com/my-ajax-app#%7B%22mode%22:21,%22popup%22:18,%22windowId%22:2%7D

上記のような少量のJSONの場合、どのブラウザーでも問題は発生していません(IE7までさかのぼります)。テストしていない大きなJSON文字列。

于 2012-07-18T05:06:37.993 に答える