2014-06-29 90 views
1

下面的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中也一样。

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