2012-08-22 97 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))

该诀窍。