0

我创建了一个简单的文件上传页面。为了保持简单,我避免使用 iFrame 来包含文件输入。因此,文件提交会触发页面重新加载,因为表单已提交。这是为了在页面上显示上传的文件名所必需的。文件名是通过 jQuery 中的 AJAX 调用获取的。

在 Mac 和 windows 上的 Chrome、Firefox、Opera、Safari 中,一切都像魅力一样工作(我没有测试过 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 应用程序。

如果有人有线索。

4

1 回答 1

0

看起来 IE9 试图在缓存方面变得聪明,并缓存未明确设置为过期的所有内容。

我的解决方案是将响应(我使用泽西岛)更改为在抵达时过期。这就是它的工作原理。

正常回复:

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 ) )

那成功了。

于 2012-08-31T06:52:53.840 回答