2012-08-22 67 views
0

我創建了一個簡單的文件上傳頁面。爲了保持簡單,我避免使用iFrames來包含文件輸入。因此,文件提交會觸發頁面重新加載,因爲表單已提交。這是爲了在頁面上顯示上傳的文件名稱而需要的。文件名是通過jQuery中的AJAX調用獲取的。IE9在文件上傳後不調用ajax方法

一切就像在Chrome,火狐,歌劇,Safari在Mac和Windows魅力(我沒有測試過Linux,但我想它也能工作)

我的問題是,在IE9中,當我打開瀏覽器,ajax調用並顯示數據。但是一旦文件上傳完成,就停止工作。

爲了確保服務器在調試模式下啓動,並在服務方法中設置了斷點。只要沒有文件上傳,就會達到中斷點。

一旦文件上傳完畢(順便說一句),斷點不會到達。 IE9不調用服務方法,並且數據不再改變。即使導航到另一個頁面(google.com),並通過編寫URL再次加載頁面也無濟於事。

這是迄今爲止我在瀏覽器中看到的最奇怪的行爲:表單被提交併且文件被髮送,但沒有執行後續的ajax調用並且頁面沒有改變。但是,JavaScript的行爲就像進行了AJAX調用一樣。只是服務器不再涉及。

這是形式:

<form method="post" action="${pageContext.request.contextPath}/services/prepop/upload/csv" 
      id="fileUploadForm" enctype="multipart/form-data"> 
     <div class="file-upload"> 
      <input id="uploadedFile" 
        type="file" 
        name="uploadedFile" 
        onchange="submit()"/> 
     </div> 
     <input type="hidden" name="formId" value='{{formId}}'/> 
     <input type="hidden" name="contentId" value='{{id}}'/> 
     <input type="hidden" name="page" value='upload'/> 
    </form> 

這是Ajax調用

app.log("getting the form files"); 
    $.ajax({ 
     url:"${pageContext.request.contextPath}/services/jsonrest/prepop/list", 
     type:"GET", 
     async:true, 
     data:[ 
     {name:"formId", value:formId} 
     ], 
     success:function (prepopContentList) { 
     app.log("the content file list was fetched with " + prepopContentList.length + " entries"); 
     upload.populateEntryList(prepopContentList, $("#fileUploadList")); 
     } 
    }); 

最奇怪的事是,日誌條目出現在日誌,但總是以同樣的價值觀。在調試模式下查看內容證實了這一點。數組總是相同的。

沒有啓用彗星。這是一個普通的jQuery應用程序。

如果有人有線索。

回答

0

它看起來像IE9試圖聰明地緩存並緩存所有未明確設置爲過期的內容。

對我來說,解決方案是改變Response(我使用Jersey)在到達時過期。這是如何工作的。

正常響應:

return Response.ok(jsForms.toJSONString(), MediaType.APPLICATION_JSON_TYPE).build(); 

過期響應:

return Response.ok(jsForms.toJSONString(), MediaType.APPLICATION_JSON_TYPE).expires(new Date(1000)).build(); 

通知加入expires(new Date(1000))

該訣竅。