下面的ajax调用提交表单数据并从服务器接收反馈作为json编码的对象/数组。适用于IE10以及最新版本的FF和Chrome。IE8和jquery.post ajax调用不起作用
在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"}]]}
ANSWERED使用@BARMAR ANSWER
我已经改变使用 “JSON” 参数设置为我的部分代码。通话后。
我相信这会自动将返回分析为json对象,因此我不必在done()函数中调用JSON.parse(data)。无论如何,JSON.parse(数据)在IE8中不起作用。请注意,我没有尝试使用Barmar建议的“$ .parseJSON()”。
//parseddata = JSON.parse(data);
此外,我再直接访问返回的对象变量suggesed:
status = data.status;
message = data.message;
failtype = data.failtype;
timeslots = data.timeslots;
这似乎在大多数情况下工作。但在IE8中对于变量“状态”不起作用!因为变量“status”在页面加载时由于某种原因而被键入为没有值的字符串,并且无法传递data.status的值,该值是一个真正的非字符串布尔值。因此,变量“地位”保持为“”。其他变量似乎很好。
这很奇怪,因为它适用于其他现代浏览器,变量“status”已经被键入为一个空字符串“”,尽管data.status = true,它不知何故成功地将值分配给“status”变量“状态”是布尔值“真”的字符串版本。
对不起,如果这是很长的啰嗦,但尽管IE8s无法纯粹的布尔值的字符串变量,我想我应该停止使用“状态”作为变量名称的事实,某个地方未知其已被键入和初始化为“”。
请参阅Firefox中的调试屏幕,其中var“status”神秘地预先键入为空字符串。在IE中也一样。
我也意识到我应该使用“var”在回调中声明变量。不使用var已经导致它们进入全局范围,并且保持了以前回调的相同值。
无论如何,我正在回答这个问题,因为原来的问题已经得到解答。
对不起,但我可以请你给我看一个如何直接访问数据的例子吗?我编辑了我的帖子以显示返回消息的示例 – aDvo
我会添加一个检查以查看数据格式是否正确:status =(parseddata.status && parseddata.status!== null)? parseddata.status:null; – frenchie
@aDvo我的答案显示了如何直接访问数据,使用'parseddata.status'等。 – Barmar