【问题标题】:IE8 and Jquery .post ajax call not workingIE8 和 Jquery .post ajax 调用不起作用
【发布时间】: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


    【解决方案1】:

    我认为 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 对象,直接访问属性即可。

    【讨论】:

    • 对不起,我可以请你给我看一个如何直接访问数据的例子吗?我已经编辑了我的帖子以显示返回消息的示例
    • 我会添加一个检查以查看数据格式是否正确:status = (parseddata.status && parseddata.status !== null) ? parseddata.status : null;
    • @aDvo 我的回答显示了如何使用parseddata.status 等直接访问数据。
    • @frenchie 没必要。如果您访问该属性但它不存在,它将分配undefined,这与分配null 一样好。
    • 感谢 Barmar,您的回答有助于回答我最初的问题,但它开辟了一个新的蠕虫罐头,我可能会做一些单独的研究。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多