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と同じものを使用しているため、両方の結果が同じであることがわかりました。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 パーサーが首を絞めているのは当然のことです。