Javascriptを使用してXHTML解析エラーを検出できますか?
-
19-08-2019 - |
質問
XHTMLページにマークアップエラーがある場合、Mozilla Firefoxは<!> quot; Yellow Screen of Death <!> quot;を表示し、黄色の背景に大きな赤いエラーメッセージのみを表示します。
これらのエラーはまれですが、非常にユーザーフレンドリーではありません 。
Javascriptを使用してこれらを検出し、それによってサーバーにメッセージを送信する方法はありますか?
これまでに発見したこと:
-解析エラーの前に配置されたスクリプトは引き続き実行されます。 (もちろん。)
-これらのスクリプトで設定されたタイムアウトと間隔は、解析エラーの後も引き続き実行されます。
-Firefoxでは、DOMは<parsererror>
とその中の<sourcetext>
です。 document.firstChild.tagName
をクエリすると、これを検出できます。
残りの質問: -このイベントを検出するためにリッスンできるイベントは何ですか? (ポーリングは吸う。) -他のブラウザでこれを検出するにはどうすればよいですか?
解決
クライアントで解析エラーをキャッチすることは可能かもしれませんが、実際には間違った問題を解決しています。
これはあなたが求めていたものではないことはわかっていますが、他のマークアップ言語を埋め込むような本当にXHTML固有の何かをしているのでなければ、application / xhtml + xmlではなくtext / htmlとしてページを提供する必要があります。 XHTMLであっても。 text / htmlとして提供することにより、実行中の問題を回避し、IEでもページが機能するようにします。使用するパーサーを決定するのはdoctype宣言ではなく、MIMEタイプであることに注意してください-移行doctypeを使用しても実行されません。
そうは言っても、ページをXHTMLとして解析したい場合は、サーバーでこの種のエラーを処理する方が良いでしょう。 DOMを構築してページを生成し、それをシリアル化した結果を送信します。それがオプションではない場合、現在のようにページを生成することから始めますが、まだクライアントに送信しません。生成したXHTMLを取得し、検証XHTMLパーサー(または少なくとも、汎用XMLパーサー)でサーバー側で解析します。エラーが発生した場合は、必要なエラーページを表示します。それ以外の場合は、解析されたDOMをシリアル化し、クライアントに送信します。
要約すると、application / xhtml + xmlを使用するための基本的なルールは次のとおりです。
- しないでください。
- (上級ユーザー向け)ページがtext / htmlとして提供されている場合に機能しないことをしていることが証明されていない限り、しないでください。これは、XHTMl文書のパーセントのごく一部に適用されます。
- ページをapplication / xhtml + xmlとして提供する必要がある場合は、妥当性を保証する何らかの方法でページを生成します。
- あなたが何をしているのかを本当に知らない限り、ユーザー入力を含むページに対してapplication / xhtml + xmlを使用しないでください 。
XHTMLはHTML 4の再構成に加えて、他の言語を埋め込む機能であることを忘れないでください。埋め込みを使用しない場合、HTML 4は、異なるがほぼ完全に互換性のある構文を使用しています。そこにある圧倒的多数のXHTMLドキュメントはtext / htmlとして提供されるため、ブラウザではHTML 4のように扱われます。
他のヒント
これはあなたの質問には答えませんが、代わりに、サーバーでXHTMLを検証してみてください。
最初の質問は次のとおりです。InternetExplorerでは、実際にapplication / xhtml + xmlをMIMEタイプとして簡単に指定することも、それをすべてサポートすることも簡単にできないため、XHTML解析エラーを検出する必要があるのはなぜですか?
エラーの検出については、 http://www.quirksmode.org をご覧くださいp>
サーバー側でドキュメントを検証することをお勧めします。しかし、本当にクライアント側でそれを行いたい場合、正しく行われていればポーリングに問題はありません(つまり、ポーリングは必ず終了します)。
以下の は、少なくともFirefoxとOperaで動作するはずです:
(function() {
if(document.documentElement &&
document.documentElement.getAttribute('xmlns') !==
'http://www.w3.org/1999/xhtml') {
alert('parsing errors');
}
else if(document.body && document.body.lastChild) {
alert('no parsing errors');
}
else setTimeout(arguments.callee, 100);
})();
おそらく最も役立つ答えではないことはわかっていますが、移行中のdoctypeへの切り替えを検討しましたか?
必ず、ファイルをパーサーに通してエラーを検出しますが、オフラインで実行します-YSODをユーザーに表示するリスクは価値がありません!