【发布时间】:2014-06-29 11:18:36
【问题描述】:
下面的 ajax 调用提交表单数据并以 json 编码对象/数组的形式从服务器接收反馈。适用于 IE10,以及最新版本的 FF 和 Chrome。
在 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 ANSWER 回答
我已更改代码以在我的 .post 调用中使用“json”参数。
我相信这会自动将返回解析为 json 对象,因此我不必再在 done() 函数中调用 JSON.parse(data)。 JSON.parse(data) 无论如何在 IE8 中都不起作用。请注意,我没有按照 Barmar 的建议尝试使用“$.parseJSON()”。
//parseddata = JSON.parse(data);
然后我按照建议直接访问了返回对象变量:
status = data.status;
message = data.message;
failtype = data.failtype;
timeslots = data.timeslots;
这似乎在大多数情况下都有效。但在 IE8 中不适用于变量“状态”!因为由于某种原因,变量“status”在页面加载时被键入为没有值的字符串,并且不能传递 data.status 的值,这是一个真正的非字符串布尔值。因此变量“状态”保持为“”。其他变量似乎没问题。
这很奇怪,因为它适用于其他现代浏览器,变量“status”已经输入为空字符串“”,尽管 data.status = true,它以某种方式成功地将值分配给“status”,给出变量"status" 布尔值 "true" 的字符串版本。
对不起,如果这是冗长的,但尽管 IE8 无法为字符串变量提供纯布尔值,我认为我应该停止使用“状态”作为变量名,因为某个未知的地方已经被键入和初始化作为“”。
查看 Firefox 中的调试屏幕,其中 var "status" 被神秘地预先输入为空字符串。在 IE 中显示相同。
我还意识到我应该使用“var”在回调中声明变量。不使用 var 导致它们成为全局范围,并持有与之前回调相同的值。
无论如何,我将此问题标记为已回答,因为原始问题已得到回答。
【问题讨论】:
标签: jquery ajax json internet-explorer-8