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 ラッパーに埋め込まれていない) 場合があります。私は次のことを試しました:
- 私は
Content-Type: text/html
もともと使用していました(ローカルPHPテストスクリプトの見落とし、本番コードの私の部分のエラー)。Firefox と Chrome では機能しましたが、XML が代わりに IFrame に XML として読み込まれた IE (9) では機能しませんでした。 Content-Type: application/xml
これがペイロードの正しいものになります。Chrome と FF でも元々 IE のみが示していた動作が発生するため、どこでも機能しなくなりました。Content-Type: application/octet-stream
: ファイルをダウンロードするだけです。Content-Type: text/plain
: これが常に HTML/body ラッピングをトリガーすることを望んでいましたが、pre
要素内のすべてをラップするため、どこでも失敗しますが、少なくとも確実に失敗します。偉大な。
少し掘り下げた後、明らかにGXTがGWTFormPanel
と同じものを使用しているため、両方の結果が同じであることがわかりました。FormPanelImpl
GWT のドキュメントには次のように書かれています (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 パーサーが首を絞めているのは当然のことです。