Как я могу предотвратить автоматический синтаксический анализ, полученный AJAX JSON, чтобы стать оконной переменной? - PullRequest
0 голосов
/ 06 августа 2009

Я использую JSON для передачи некоторых данных через AJAX от внутреннего интерфейса к внешнему интерфейсу (конечно, Javascript). XMLHttpRequest выполняется AJAX-обработчиком, написанным Prototypejs (я все еще в процессе миграции на jQuery, но режим noConflict позволяет мне запускать оба одновременно), после чего PHP отправляет заголовок X-Json с некоторыми данными как objects = {'foo': 'bar'}.

Prototypejs- Ajax.Request передает переменную json обратному вызову onSuccess, содержащему все данные JSON, поэтому обработка не является сложной частью. Однако я заметил, что, поскольку JSON вычисляется автоматически, переменная objects становится глобальной (и, следовательно, членом объекта window.

Я знаю, что это не на самом деле проблема, так как это просто неиспользуемая переменная, но я всегда старался держаться как можно дальше от глобальных переменных. Кроме того, в некоторых случаях наборы данных могут быть довольно большими, поэтому это будет просто огромная дублирующаяся переменная, из которых никогда не используется. Так что, если возможно, я бы предпочел потерять глобальное.

Мой вопрос: как? Если для этого есть веская причина, или это просто проблема, связанная с Prototypejs, или если это просто указывает на то, что я делаю что-то очень неправильное, скажите мне: -)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 августа 2009

Вы отправляете обратно objects = {"foo":"bar"} из PHP? При отправке 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:

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

Обратите внимание, что функции PHP json_encode и json_decode создадут «правильный» JSON для вас, что означает, что он будет использовать двойные кавычки и не будет использовать никаких тип присваивания (True JSON ограничен массивом / объектом как самое внешнее значение и может не содержать присваивания или вызовов функций. См. спецификацию JSON .)

1 голос
/ 06 августа 2009

Если PHP выводит objects = {'foo': 'bar'}, то он не выводит JSON. JSON не может включать символ '=' вне строки и использует символ двойной кавычки, а не одинарную кавычку. Это означает, что он выводит JavaScript.

У вас есть два варианта здесь.

Первый - попытаться ограничить область действия JavaScript, второй - исправить PHP, чтобы он выводил настоящий JSON.

Я бы порекомендовал второй вариант. Разобраться с JSON, а не с JavaScript.

Если вы хотите попытаться ограничить это, то вам нужно как-то ограничить область действия. Возможно с:

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

… хотя я не уверен, какова область применения eval ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...