2011-02-05 101 views
3

我有在IE8奇怪的行爲,我無法解釋執行下面的JavaScript函數:奇怪的行爲解析JSON在IE8

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是假的所有孔):

[{"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結果爲true孔口(僅在IE8(我沒有測試過IE的其他版本,我指的是這樣的事實是否能夠正常工作在Chrome,Firefox和Safari中)),導致按鈕值被設置爲「開」 。我是否錯過了應該顯而易見的事情?

+1

這可能是過去請求的緩存版本嗎?嘗試使用`$ .getJSON(action +'?_ ='+(new Date())。getTime(),...' – lonesomeday 2011-02-05 21:37:03

回答

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)如果你已經得到了你的URL參數,你將需要使用&_=來代替。

1

嗨嘗試使用瀏覽器dom方法eval(),看看是否適合你..我不知道這是否是你的問題。 否則我建議首先評估json strring到一個對象,然後循環通過相同的abd驗證它。我的觀點是循環在IE中導致一些問題。