2009-08-06 13 views
0

私はバックエンドからフロントエンドへのAJAXを介していくつかのデータを通信するためにJSONを使用しています(Javascript、もちろん)。 XMLHttpRequestは、プロトタイプで書かれたAJAXハンドラによって行われます(私はまだjQueryに移行していますが、noConflictモードでは両方を同時に実行できます)。その後PHPはX-Jsonヘッダにデータを送信しますobjects = {'foo': 'bar'}のように。自動解析されたAJAXで得られたJSONがウィンドウ変数にならないようにするにはどうすればよいですか?

Prototypejs- Ajax.Requestは、すべてのJSONデータを含むonSuccess -callbackに変数jsonを渡すため、処理は難しい部分ではありません。しかし、私はそれだけで未使用の変数なので、私はそれが本当に問題ではないことを知っている

。JSONが自動的に評価されているので、objects変数はグローバルに(したがってwindowオブジェクトのメンバーであることに気づいたが、私また、できる限り多くのグローバル変数から離れようとしましたが、データセットがかなり大きい場合もありますので、使用されていない大きな重複変数になります。

私の質問:どうしたらいいのでしょうか、これがPrototypejs固有の問題であるか、これがちょっと間違ったことを示しているのであれば、m e :-)

ありがとうございます!

答えて

2

PHPからobjects = {"foo":"bar"}を送っていますか? JSONを送信すると、あなただけの{"foo":"bar"}を送信し、evalのリターン結果としてデータを取得:

var json = '{"foo":"bar"}'; // This string would really be coming from PHP 
// ... 
var objects = eval('(' + json + ')'); // objects variable will be limited to the 
             // current scope. 

何らかの理由で、あなたがobjects = ...を評価しなければならない、する場合は、evalを実行する前に、現在のスコープに変数を制限することができます。 PHP関数json_encodejson_decodeが、それは二重引用符を使用することを意味している、あなたのための「適切な」JSONを作成し、それは私たちがいないということ

var objects; 
eval('objects = {"foo":"bar"}'); 

注意任意の種類の代入(True J​​SONは配列/オブジェクトが最も外側の値に限定されており、代入や関数呼び出しは含まれていない可能性があります。 JSON specificationを参照してください。

+0

ありがとう、私はちょっと正しい構文で混乱していたと思います。Prototypeに 'json'パラメータを渡すことができなかったので、私は自動評価が必要でした...誤った形式のX-Jsonヘッダを使っていました。これはおそらくすべての問題を解決するでしょう、ありがとう;-) – JorenB

1

PHPがobjects = {'foo': 'bar'}を出力している場合、JSONは出力されません。 JSONは文字列の外側に '='文字を含めることはできず、一重引用符ではなく二重引用符を使用します。つまり、JavaScriptを出力しています。

ここには2つのオプションがあります。

最初はJavaScriptのスコープを制限しようとします.2番目はPHPを修正して実際のJSONを出力することです。

2番目のオプションをお勧めします。 JavaScriptではなくJSONを扱う

もしあなたがそれを制限しようとするなら、何とかスコープを制限する必要があります。おそらく:

function() { 
    eval("var " + php_generated_code); 
    doSomethingWith(object); 
} 

...私はeval()のスコープが何であるか分かりませんが。

関連する問題