0

簡単なファイルアップロードページを作成しました。シンプルにするために、iFrame を使用してファイル入力を含めることは控えました。したがって、フォームが送信されるため、ファイルの送信によってページのリロードがトリガーされます。これは、アップロードされたファイル名をページに表示するために必要です。ファイル名は、jQuery の AJAX 呼び出しを介して取得されます。

Chrome、Firefox、Opera、Mac および Windows の 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 に答える