IE8和Jquery .post ajax调用不起作用

时间:2014-06-29 11:18:37

标签: jquery ajax json internet-explorer-8

下面的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中也是如此。

enter image description here 我还意识到我应该使用&#34; var&#34;在回调中声明变量。不使用var导致它们成为全局范围并且从先前的回调中保持相同的值。

无论如何,我已将此问题标记为原始问题已得到解答。

1 个答案:

答案 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对象,只是直接访问属性。