Ниже приведенный вызов 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.
Я также понял, что я должен декларировать переменные в обратных вызовах, используя «var». Не использование var привело к тому, что они получили глобальную область видимости и сохраняли одни и те же значения из предыдущих обратных вызовов.
В любом случае, я отмечаю этот вопрос так, как вам ответил, поскольку на исходный вопрос был дан ответ.
Извините, но могу ли я попросить вас показать мне пример того, как напрямую обращаться к данным? Я отредактировал свое сообщение, чтобы показать пример обратного сообщения – aDvo
Я бы добавил чек, чтобы проверить правильность формата данных: status = (parseddata.status && parseddata.status! == null)? parseddata.status: null; – frenchie
@aDvo Мой ответ показывает, как напрямую обращаться к данным, используя 'parseddata.status' и т. Д. – Barmar