2014-06-29 3 views
1

Ниже приведенный вызов ajax отправляет данные формы и получает обратную связь с сервера в виде json-кодированного объекта/массива. Работает на IE10, а также последние версии FF и Chrome.IE8 и JQuery .post ajax call not working

Не работает в IE8. Используя инструменты разработчика IE8, я мог видеть, что массив json был фактически возвращен с моего сервера в мой браузер. Однако в строке с выражением «.each» он полностью пропускает этот цикл, как если бы не было данных в ответе ajax.

Кто-нибудь знает, в чем проблема? Я читал другие форумы, которые предложили использовать datatype = json, но не знаете, как это сделать в моем коде. Другие предложили изменить .post на .ajax. Но я не хочу делать изменения, прежде чем я действительно пойму, почему IE8 не работает.

$.post("<?php echo Router::url(array('controller'=>'Bookings','action'=>'saveBooking_ajax')); ?>", $(".reservationform").serialize(), function() { 

      }) 
       .done(function(data) { 

        parseddata = JSON.parse(data); 

        //IE8 totally skips this next part even if parseddata has data 
        $.each(parseddata, function(key, value) { 
         if (key == "status") status = value; 
         if (key == "message") message = value; 
         if (key == "failuretype") failuretype = value; 
         if (key == "bookingref") bookingref = value; 
        }); 

пример ответа, возвращаемого из сервера:

{"status":true,"failtype":"USER","message":"","timeslots":[[{"18:00:00":"6:00 pm"},{"18:10:00":"6:10 pm"},{"18:20:00":"6:20 pm"},{"18:30:00":"6:30 pm"},{"18:40:00":"6:40 pm"},{"19:20:00":"7:20 pm"},{"19:30:00":"7:30 pm"},{"19:40:00":"7:40 pm"},{"20:20:00":"8:20 pm"},{"20:30:00":"8:30 pm"},{"20:40:00":"8:40 pm"}]]} 

ОТВЕТИЛ ИСПОЛЬЗОВАНИЕ @BARMAR ОТВЕТ

Я изменил код, чтобы использовать параметр "JSon" как часть моей. почтовый вызов.

Я считаю, что это автоматически анализирует возвращение как объект json, поэтому мне больше не нужно было вызывать JSON.parse (data) в функции done(). JSON.parse (данные) в любом случае не работает в IE8. Обратите внимание, что я не пытался использовать «$ .parseJSON()», как было предложено Barmar.

  //parseddata = JSON.parse(data); 

Также я затем получить доступ к переменным возврата объекта непосредственно в suggesed:

  status = data.status; 
      message = data.message; 
      failtype = data.failtype; 
      timeslots = data.timeslots; 

Это, кажется, работает в большинстве случаев. Но не работает в IE8 для переменной «Статус»! потому что переменная «статус» по какой-то причине нагрузка на страницу была введена как строка без значения и не может быть передана значение data.status, которое является истинным нестрочным логическим значением. Следовательно, переменный «статус» остается как «». Другие переменные кажутся прекрасными.

Это странно, потому что это работает в других современных браузерах, переменная «статус» уже введена как пустая строка «», и, несмотря на data.status = true, она каким-то образом успешно присваивает значение «статус», давая переменная «status» строковая версия логического значения «true».

Извините, если это длинный ветер, но, несмотря на неспособность IE8 к чисто логическому значению для строковой переменной, я думаю, что я должен просто прекратить использовать «статус» в качестве имени переменной для того, что где-то неизвестно, что он уже набирается и инициализируется как "".

См. Экран отладки в firefox, где var «status» загадочно предварительно введен как пустая строка. То же самое проявляется в IE.

enter image description here Я также понял, что я должен декларировать переменные в обратных вызовах, используя «var». Не использование var привело к тому, что они получили глобальную область видимости и сохраняли одни и те же значения из предыдущих обратных вызовов.

В любом случае, я отмечаю этот вопрос так, как вам ответил, поскольку на исходный вопрос был дан ответ.

ответ

3

Я не думаю, что IE8 имеет JSON.parse(). Используйте $.parseJSON(). Или укажите аргумент datatype для `$.сообщение:

$.post("url", $(".reservationform").serialize, "json") 
    .done(function(parseddate) { 
     status = parseddata.status; 
     message = parseddata.message; 
     failuretype = parseddata.failuretype; 
     bookingref = parseddata.bookingref; 
}); 

Вам также не нужно использовать $.each() считывать значения из данных. Это объект Javascript, просто доступ к свойствам напрямую.

+0

Извините, но могу ли я попросить вас показать мне пример того, как напрямую обращаться к данным? Я отредактировал свое сообщение, чтобы показать пример обратного сообщения – aDvo

+0

Я бы добавил чек, чтобы проверить правильность формата данных: status = (parseddata.status && parseddata.status! == null)? parseddata.status: null; – frenchie

+0

@aDvo Мой ответ показывает, как напрямую обращаться к данным, используя 'parseddata.status' и т. Д. – Barmar