フォームのアップロードの進行状況バーを作成しようとしています (新しい HTML5 API ではなく、古い HTML4 フォームのアップロード)。進行状況は、ファイルが移動された後に行われた追加の作業を実際に追跡します。設計された方法は、追加の作業が完了するまでストリームが開いたままになり、その後サーバー側のメソッドが最終的に戻り、ストリームを閉じることです。
Chrome に固有の可能性がある問題がいくつかあります。私も実用的な実装を持っていますが、「より良い」ものを手に入れたいと思っています。
コードを要求する可能性が高い人のために: 意図的にここにはありません。シナリオは問題を説明しています。コード自体は「過失」ではなく、より混乱するだけです。
失敗した試み #1 一言で言えば
- フォームのアップロードを開始
- 一部の JSON で進行状況を取得する Ajax 呼び出しに間隔を設定する
- データをプログレス バーにレンダリングする
失敗の理由: アップロード ストリームがページ上の他のアクティビティをブロックし、転送中に追加の Ajax 呼び出しを行うことができません。
失敗した試み #2 一言で言えば
- 同じ Ajax 呼び出しを含む iFrame を作成する
- データを iFrame 内の要素にレンダリングします (必要なものはすべて自己完結型であり、少なくとも「トップ」ドキュメントを参照しません)。
結果:
フォームのアップロードを開始する前に、JSON から「ステータス: 待機中」をレンダリングできました。レンダリング関数もカウンターをインクリメントしたので、「試行 #X」が表示されます。ステータスが待機している間、試行回数が増加します。
転送が開始された後、Ajax 呼び出しは正常に 200 を取得し、JSON が実際にそこにあることを確認するために応答を調べることができました。
ただし、iFrame の「シャドウ DOM」(正しい用語ですか?) を更新できませんでした。iFrame 内のノードにアクセスして変更しようとすると失敗しました。カウンターでさえ増加しませんでした。
転送が完了すると、「ステータス: 完了」が正常にレンダリングされ、カウンターがジャンプします (カウンターは増加していましたが、iFrame へのレンダリングが機能していませんでした)。
ぐら!
成功した試み
iFrame は Ajax を要求しなくなりました。iframe の src 属性は、事前にレンダリングされたプログレス バーを返す URL に設定されます。iframe に読み込まれるドキュメントは、それ自体を再読み込みするように設定されています。したがって、所定の間隔で、「移動」した新しい進行状況バーを再レンダリングします。
その結果、「機能している」プログレス バーが表示されますが、リクエストの遅延により iframe が一瞬空白になることがありますが、これは私の好みではありません。
誰でもこれを行うためのより良い方法を考えることができますか? フォーム自体を iFrame に配置し、代わりに Ajax を「トップ」ドキュメントで動作させることは可能ですか?
主にプレゼンテーション層をデータ層から分離したいのですが、レンダリングされた進行状況バーを返さなければならない限り、それはうまくいきません。おまけとして、Ajax を介して進行状況バーを更新する方法を見つけることができれば、これらの「空白」ブリップはなくなります。