3

TL/DR: XML 応答をFormPanel確実にロードする方法は?


ほとんどの UI に Sencha GXT を使用した GWT の Web アプリケーションがあります。GXTFormPanelを使用してファイルをサーバー側スクリプト (ファイルの内容をエコーするだけ) にアップロードし、ローカル ファイルの内容を JS で取得します。最終的にこれは FileReader で行うことができますが、それをサポートしていないブラウザーでは明らかにできません。

FormPanelフォームを送信し、非表示の IFrame に結果をロードします。この IFrame から、次のスニペットでコンテンツが抽出されます ( からFormPanelImpl.class)。

try {
  // Make sure the iframe's window & document are loaded.
  if (!iframe.contentWindow || !iframe.contentWindow.document)
    return null;

  // Get the body's entire inner HTML.
  return iframe.contentWindow.document.body.innerHTML;
} catch (e) {
  return null;
}

その方法で XML ファイルを読み込んでいますが、問題のある行は次のとおりです。

return iframe.contentWindow.document.body.innerHTML;

XML が XML として読み込まれるため (したがって、HTML ラッパーに埋め込まれていない) 場合があります。私は次のことを試しました:

  1. 私はContent-Type: text/htmlもともと使用していました(ローカルPHPテストスクリプトの見落とし、本番コードの私の部分のエラー)。Firefox と Chrome では機能しましたが、XML が代わりに IFrame に XML として読み込まれた IE (9) では機能しませんでした。
  2. Content-Type: application/xmlこれがペイロードの正しいものになります。Chrome と FF でも元々 IE のみが示していた動作が発生するため、どこでも機能しなくなりました。
  3. Content-Type: application/octet-stream: ファイルをダウンロードするだけです。
  4. Content-Type: text/plain: これが常に HTML/body ラッピングをトリガーすることを望んでいましたが、pre要素内のすべてをラップするため、どこでも失敗しますが、少なくとも確実に失敗します。偉大な。

少し掘り下げた後、明らかにGXTがGWTFormPanelと同じものを使用しているため、両方の結果が同じであることがわかりました。FormPanelImplGWT のドキュメントには次のように書かれています (Sencha は賢明にもこれを差し控えました):

バックエンド サーバーは content-type で応答することが期待さ'text/html'れます。つまり、返されるテキストは HTML として扱われます。サーバーによって他のコンテンツ タイプが指定されている場合、onFormSubmitイベントで送信される結果の html はブラウザー間で予測できず、FormHandler.onSubmitComplete(FormSubmitCompleteEvent)イベントはまったく発生しない可能性があります。

ただし、送信してもtext/html、ペイロードが XML の場合、ブラウザ間での動作は予測できません。

これに対する一般的な解決策はありますか?それとも、ひどく些細なことを見落としているのでしょうか (GWT を見てからまだ 3 日しか経っていません)。

編集:<html><body> IEでもIFrameに本文があるように、ファイルの内容に追加しようとしました。ええ、そうしましたが、次のような非常に奇妙な結果にもなりましたinnerHTML

<?XML:NAMESPACE PREFIX = [default] ...

XML パーサーが首を絞めているのは当然のことです。

4

2 に答える 2

1

私の推測では、一般に、特殊文字のエスケープを実行せずに XML を HTML コンテキストでラップすることは、確実には機能しません。少なくとも次のような XML ドキュメントでは失敗すると思います。

<a>
  <b>
    <html>
    </html>
  </b>
</a>

私たちが取ったアプローチは、小さな「OK」メッセージを送り返し、別のリクエストを使用してサーバーから (キャッシュされた) コンテンツを取得するというものです。

あるいは、HTML のエンコード/デコード (または Base64 など) を実行することもおそらく可能です。

于 2012-07-03T16:23:27.293 に答える