下面的ajax调用提交表单数据并从服务器接收反馈作为json编码的对象/数组。适用于IE10,以及最新版本的FF和Chrome。
在IE8中不起作用。使用IE8开发人员工具,我可以看到json数组实际上是从我的服务器返回到我的浏览器。但是在" $。每个"声明它完全跳过该循环,好像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答案
我已将代码更改为使用&#34; json&#34;参数作为我.post调用的一部分。
我相信这会自动将返回解析为json对象,因此我不必再在done()函数中调用JSON.parse(data)。无论如何,JSON.parse(数据)在IE8中不起作用。请注意,我没有尝试使用&#34; $。parseJSON()&#34;正如巴马尔所建议的那样。
//parseddata = JSON.parse(data);
然后我直接以suggesed:
的形式访问了返回对象变量 status = data.status;
message = data.message;
failtype = data.failtype;
timeslots = data.timeslots;
这似乎适用于大多数情况。但是在IE8中不能用于变量&#34;状态&#34;!因为变量&#34; status&#34;由于某种原因,页面加载被键入为没有值的字符串,并且不能传递data.status的值,这是一个真正的非字符串布尔值。因此变量&#34;状态&#34;仍然是&#34;&#34;。其他变量看起来很好。
这很奇怪,因为这适用于其他现代浏览器,变量&#34; status&#34;已经输入为空字符串&#34;&#34;,尽管data.status = true,但它以某种方式成功地将值赋给&#34; status&#34;,给出变量&#34; status&#34;布尔值的字符串版本&#34; true&#34;。
很抱歉,如果这是长篇大论,但尽管IE8无法将纯粹的布尔值转换为字符串变量,我想我应该停止使用&#34; status&#34;作为一个变量名称,因为某个未知的地方已被输入并初始化为&#34;&#34;。
请参阅firefox中的调试屏幕,其中var&#34; status&#34;神秘地预先输入为空字符串。在IE中也是如此。
我还意识到我应该使用&#34; var&#34;在回调中声明变量。不使用var导致它们成为全局范围并且从先前的回调中保持相同的值。
无论如何,我已将此问题标记为原始问题已得到解答。
答案 0 :(得分:3)
我不认为IE8有JSON.parse()
。使用$.parseJSON()
。或者将datatype
参数指定为`$ .post:
$.post("url", $(".reservationform").serialize, "json")
.done(function(parseddate) {
status = parseddata.status;
message = parseddata.message;
failuretype = parseddata.failuretype;
bookingref = parseddata.bookingref;
});
您也不需要使用$.each()
来读取数据中的值。它是一个Javascript对象,只是直接访问属性。