我在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}]

奇怪的是,第1孔的e.InEmergency结果为true(仅在IE8中(我尚未测试过其他版本的IE,我指的是它在Chrome,Firefox和Safari中正常工作的事实)),导致按钮值为设置为“开”。我是否缺少一些显而易见的东西?

最佳答案

与其他浏览器相比,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)如果您的URL中已经有参数,则需要使用&_=代替。

10-07 14:02
查看更多