Проблема с Javascript, AJAX и JSON - PullRequest
0 голосов
/ 14 августа 2011

Я разработчик для iPhone, чей новичок в веб-разработке, поэтому, пожалуйста, прости меня, если я делаю глупые ошибки здесь:

Я пытаюсь добиться, когда пользователь выбирает элемент изв раскрывающемся списке он вызывает некоторый javascript, который отправляет запрос AJAX в имеющийся у меня файл PHP, который возвращает некоторый JSON.- Это JSON включает в себя имя файла с миниатюрой изображения и подпись к изображению.Они должны быть переданы в изображение и текстовое поле соответственно в моем документе.

Проблема в том, что он не работает после попытки оценить json.- То же самое происходит с eval(json); и JSON.parse(json);. Я решил это, вызвав document.write ('нечто');периодически в моем методе ответа.- Он всегда сможет записать до точки, где он анализирует json.

Я уверен, что мой PHP действителен, а мой запрос в порядке (я могу вывести ответ из JS в порядке).

Вот функция, которую я вызываю, когда в выпадающем списке выбирается новый элемент:

function changeImage(id){
    var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
    {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        var res=xmlhttp.responseText;
        var responseObject = eval(res);
        var caption = responseObject.caption;
        var textField = document.getElementById('caption');
        textField.value = caption;
        var imagePreview = document.getElementById('imgPreview');
        imagePreview.src = responseObject.filename;
        }
      }
    xmlhttp.open("GET","getCaption.php?id="+id,true);
    xmlhttp.send();
}

Когда я выводю res (или получаю доступ к файлу php вручную), JSON выглядит следующим образом:

{"caption":"A caption","filename":"myimage_thumb.jpg"}

почему происходит сбой JSON eval?

ОБНОВЛЕНИЕ: Эта ошибка регистрируется: SyntaxError: Parse error

Ответы [ 5 ]

6 голосов
/ 14 августа 2011

Вы берете строку JSON и делаете вид, что это литерал объекта Javascript.Но, помните, JSON просто назван в честь нотации объекта Javascript!

Затем вы надеетесь, что eval непосредственно оценит это и вернет объект, ноэто не так.


Наблюдения

Запись в консоли Firebug следующего:

eval('{"caption":"A caption","filename":"myimage_thumb.jpg"}')

также приведет к ошибке SyntaxError.(В идеале вы бы сузили свою проблему до этого!)

Интересно, что более явное построение объекта работает (для этого ввода):

eval('new Object({"caption":"A caption","filename":"myimage_thumb.jpg"})')

Как и просто форсированиевводить в выражение определенного типа с круглыми скобками:

eval('({"caption":"A caption","filename":"myimage_thumb.jpg"})')

Пояснение

Все сводится к этому утверждению из 12.4 в стандарте ECMAScript:

Обратите внимание, что ExpressionStatement не может начинаться с открывающей фигурной скобки, поскольку это может сделать его неоднозначным с блоком.

В этой статье подробно объясняется проблема,но в итоге решение состоит в том, чтобы использовать JSON.parse(res) для получения объекта из строки JSON .Это правильный подход, и он не потерпит неудачу, если ваш ввод действителен в формате JSON.

1 голос
/ 14 августа 2011

Возможно, вы захотите попробовать:

eval("(" + res + ")");

, чтобы обернуть его в (...). Я пока не знаю, почему.

В любом случае, вы также можете заглянуть в jQuery, потому что тогда все просто:

$.getJSON("path", function(json) {
    // json is the ready-to-use object
});
1 голос
/ 14 августа 2011

В этом контексте я бы дал несколько предложений

  • Можете ли вы попробовать console.log(res) или alert(res), чтобы вы знали, что у вас действительно есть a res, прежде чем пытаться его использовать.

  • Никогда не используйте eval(res). Почему бы не использовать JSON.parse(res) (в современных браузерах, поскольку у вас там тоже есть браузеры IE5), или даже лучше $.parseJSON (при использовании jQuery)

  • Если вы отправляете if из PHP, используйте json_encode($var, JSON_HEX_TAG|JSON_HEX_APOS), чтобы предотвратить синтаксические ошибки при разборе. Проверьте мой ответ (ссылка ниже) в другой теме.

    Как хранить массив php на стороне клиента?

1 голос
/ 14 августа 2011

Изменить eval-линию на:

eval('var responseObject = ' + res);
0 голосов
/ 14 августа 2011

Вот как я использую eval -

var rsltObj = eval('(' + jsonStr + ')');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...