1

XHTMLページでマークアップエラーが発生すると、MozillaFirefoxは「YellowScreenof Death」を表示し、黄色の背景に大きな赤いエラーメッセージのみを表示します。

これらのエラーはまれですが、非常にユーザーフレンドリーではありません。

Javascriptを使用してこれらを検出し、それによってサーバーにメッセージを送り返す方法はありますか?

私がこれまでに発見したこと:-解析エラーの前に配置されたスクリプトはまだ実行されます。(もちろんです。)-これらのスクリプトで設定されたタイムアウトと間隔は、解析エラー後も実行されます。-Firefoxでは、DOMは<parsererror>内部<sourcetext>にあります。クエリを実行すると、これを検出できますdocument.firstChild.tagName

残りの質問:-これを検出するために聞くことができるイベントは何ですか?(ポーリングは最悪です。)-他のブラウザでこれを検出するにはどうすればよいですか?

4

5 に答える 5

2

クライアントで解析エラーをキャッチすることは可能かもしれませんが、実際には間違った問題を解決しています。

これはあなたが要求したものではないことは承知していますが、他のマークアップ言語を埋め込むなど、真に XHTML 固有のことを行っている場合を除き、ページを application/xhtml+xml ではなく text/html として提供する必要があります。XHTMLであっても。これを text/html として提供することで、発生している問題を回避し、ページを IE でも動作させることができます。どのパーサーが使用されるかを決定するのは doctype 宣言ではなく、MIME タイプであることに注意してください。

とはいえ、ページを XHTML として解析することが本当に必要な場合は、この種のエラーをサーバーで処理することをお勧めします。DOM を構築してページを生成し、それをシリアル化した結果を送信します。それができない場合は、現在行っているようにページを生成することから始めますが、まだクライアントに送信しないでください。生成した XHTML をサーバー側で検証用 XHTML パーサー (または少なくとも汎用 XML パーサー) で解析します。エラーが発生した場合は、必要なエラー ページを表示します。それ以外の場合は、解析された DOM をシリアル化し、それをクライアントに送信します。

要約すると、application/xhtml+xml を使用するための基本的な規則は次のとおりです。

  1. しないでください。
  2. (上級ユーザー向け) ページが text/html として提供されている場合に機能しないことを行っていることが証明されていない限り、使用しないでください。これは、XHTMl ドキュメントのごく一部に当てはまります。
  3. ページを application/xhtml+xml として提供する必要がある場合は、有効性を保証する何らかの方法でページを生成してください。
  4. 自分が何をしているのか本当にわかっていない限り、ユーザー入力を含むページに application/xhtml+xml を使用しないでください。

XHTML は、HTML 4 の再定式化に他の言語を埋め込む機能を加えたものに過ぎないことを思い出してください。埋め込みを使用しない場合は、異なるがほぼ完全に互換性のある構文を持つ HTML 4 になります。XHTML ドキュメントの圧倒的多数は text/html として提供されるため、ブラウザーでは HTML 4 のように扱われます。

于 2009-01-16T05:36:00.950 に答える
1

サーバー側でドキュメントを検証することをお勧めします。ただし、本当にクライアント側で実行したい場合は、正しく実行されればポーリングに問題はありません(つまり、ポーリングは確実に終了します)。

以下は、少なくとも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);
})();
于 2009-01-16T09:40:15.543 に答える
1

これはあなたの質問への回答ではありませんが、代わりに、XHTML を生成した後/生成したとき、およびブラウザーに送信する前に、サーバー上で XHTML を検証してみませんか?

于 2009-01-16T05:07:10.697 に答える
1

私の最初の質問は次のとおりです。Internet Explorer では、実際に application/xhtml+xml を MIME タイプとして指定することも、それをすべてサポートすることも簡単にできないため、XHTML 解析エラーを検出する必要があるのはなぜですか?

エラーの検出については、http: //www.quirksmode.org をご覧ください。

于 2009-01-16T05:40:42.923 に答える
0

おそらく最も役立つ答えではないことは知っていますが、移行型のDoctypeに切り替えることを検討しましたか?

必ず、ファイルをパーサーに通してエラーを検出しますが、オフラインで実行してください。ユーザーにYSODを表示するリスクはありません。

于 2009-01-16T05:04:55.210 に答える