在IE8中解析JSON的奇怪行为

时间:2011-02-05 21:33:35

标签: javascript jquery json internet-explorer-8

我在IE8中有一些奇怪的行为,我无法解释执行以下JavaScript函数:

function getStatus() {
    var action = "/Device/Status";

    $.getJSON(action, function (data) {
        $.each(data, function (i, e) {
            $('#btnEmergency' + e.BoreId).val(e.InEmergency ? "On" : "Off");
        });
    });
}

加载Fiddler后,我验证返回了以下JSON结果(注意所有内核的InEmergency都为false):

[{"BoreId":1,"InEmergency":false},{"BoreId":2,"InEmergency":false},{"BoreId":3,"InEmergency":false},{"BoreId":4,"InEmergency":false},{"BoreId":5,"InEmergency":false},{"BoreId":6,"InEmergency":false}]

奇怪的是,e.InEmergency对于1号洞来说是真实的(仅在IE8中(我没有测试过其他版本的IE,我指的是它在Chrome,Firefox和Safari中正常工作)),导致按钮值设置为“开”。我错过了一些显而易见的事情吗?

2 个答案:

答案 0 :(得分:1)

您尝试使用浏览器dom方法eval()并查看是否适合您..我不确定这是否是您的问题。 另外我建议首先评估json strring到一个对象,然后循环遍历相同的abd验证它。我的观点是循环在IE中引起了一些问题。

答案 1 :(得分:1)

与其他浏览器相比,Internet Explorer具有不同的缓存行为(不可避免)。特别是,当它无用时,它倾向于缓存XMLHTTPRequest请求。

解决这个问题的方法是添加一个随每个请求更改的无用参数,使其唯一,从而确保没有缓存值。使用以毫秒为单位的时间是一种非常简单的方法:

function getStatus() {
    var action = "/Device/Status";

    $.getJSON(action + '?_=' + (new Date()).getTime(), function (data) {
        $.each(data, function (i, e) {
            $('#btnEmergency' + e.BoreId).val(e.InEmergency ? "On" : "Off");
        });
    });
}

请注意:(a)这是jQuery在cache: false次调用中$.ajax的行为方式;(b)如果您的网址中已有参数,则需要使用&_=代替