web-dev-qa-db-ja.com

要素の自己終了タグを書くことは、伝統的に空ではない悪い習慣ですか?

JQuery(またはFirefox)が私の<span class="presentational"></span> into <span class="presentational" />

今私の質問は、これは私のように私のマークアップを書くことは大丈夫ですか?ブラウザーはそれで窒息しますか?

個人的には、もっときれいに見えると思います<span class="presentational" />空になる場合。

48
alex

あなたの質問は、Firefoxでソースを表示するときの自己終了要素の赤い末尾のスラッシュに関係していると思います。もしそうなら、あなたは最も激しいものの1つに偶然遭遇しましたが、同時にブラウザメーカーとウェブ開発者の戦争におけるパッシブでアグレッシブな議論です。 XHTMLはドキュメントのマークアップだけではありません。また、ドキュメントがWeb経由で提供されることを意図しています。

始める前に;ここでは脇役にならないように頑張っています。

XHTML 1.1仕様では、Webサーバーはcontent-Typeがapplication/xhtml + xmlのXHTMLを提供する必要があるとしています。ドキュメントがapplication/xhtml + xmlではなくtext/htmlとして提供されているため、Firefoxはこれらの末尾のスラッシュを無効として選択しています。次の2つの例を見てください。同じマークアップ。1つはapplication/xhtml + xmlとして機能し、もう1つはtext/htmlとして機能します。

http://alanstorm.com/testbed/xhtml-as-html.php

http://alanstorm.com/testbed/xhtml-as-xhtml.php

Firefoxは、メタタグの末尾のスラッシュに、text/htmlで提供されるドキュメントでは無効であり、application/xhtml + xmlで提供されるドキュメントでは有効であるとフラグを立てます。

なぜこれが物議を醸すのか

ブラウザ開発者にとってXHTMLのポイントは、ドキュメントをXMLとして扱うことができるということです。つまり、誰かが無効なものを送ってきた場合、仕様を解析する必要がないと仕様に記載されています。したがって、ドキュメントがapplication/xhtml + xmlとして提供され、整形式でないコンテンツがある場合、開発者は「私の問題ではない」と言うことができます。あなたはここでそれを実際に見ることができます

http://alanstorm.com/testbed/xhtml-not-valid.php

ドキュメントがtext/htmlとして提供されると、Firefoxはそれをプレーンな古いHTMLドキュメントとして扱い、寛容なものを使用して修正し、ルーチンを解析します

http://alanstorm.com/testbed/xhtml-not-valid-as-html.php

したがって、ブラウザメーカーにとって、text/htmlとして提供されるXHTMLは、ブラウザのレンダリングエンジンによってXMLとして扱われることがないため、ばかげています。

何年も前に、タグモンキー以上のものを求めているWeb開発者(免責事項:私は自分をその1つとして含めています)は、3つの入れ子になったテーブルを使用せず、魅力的なデザインエクスペリエンスを可能にするベストプラクティスを開発する方法を探し始めました。彼ら/私たちはXHTML/CSSを採用しました。これは、W3Cがこれは未来であり、他の唯一の選択肢は、単一のベンダー(Microsoft)が事実上のマークアップ仕様を制御する世界であったためです。シングルベンダーが存在し、Microsoftはそれほどではないという本当の悪。私は誓います。

では論争はどこにあるのでしょうか? application/xhtml + xmlには2つの問題があります。 1つはInternet Explorerです。 IEにレガシーのバグ/機能があります。ここで、application/xhtml + xmlとして提供されるコンテンツは、ユーザーにドキュメントをダウンロードするように求めます。上記のxhtml-as-xhtml.phpにアクセスしようとした場合IEこれはおそらく起こったことです。つまり、application/xhtml + xmlを使用したい場合、 iEのブラウザスニフ、Acceptsヘッダーを確認し、それを受け入れるブラウザーにのみapplication/xhtml + xmlを提供します。これは それほど重要ではない であり、正しく理解されているように思えます。また、Web開発者が求めていた「1回限りの書き込み」の原則にも反しました。

2番目の問題は、XMLの厳しさです。これもまた、炎が発生しやすい問題の1つですが、1つの不正なタグや、不適切にエンコードされた1つの文字が、目的のドキュメントをユーザーに表示させないようにする必要があると考える人もいます。言い換えると、はい、XMLの形式が適切でない場合は処理を停止する必要があると仕様に記載されていますが、ユーザーは仕様を気にせず、猫のWebサイトが壊れていることを気にします。

問題にさらにガソリンを追加すると、XHTML 1.0(1.1ではない)の仕様に、XHTMLドキュメントmayが特定の 互換性ガイドライン に従っている場合、text/htmlとして提供されると記載されています。 imgタグが自動終了するようなものです。ここでのキーワードはmayです。 RFC話す では、オプションであることを意味します。 Firefoxは、XHTML doctypeで提供されるドキュメントではなく、text/htmlのコンテンツタイプをXHTMLとして扱うことを選択しました。ただし、W3Cバリデーターはこれらのドキュメントを有効であると喜んで報告します。

mayの意味を定義するためにドキュメントを作成する文化の不思議/恐怖を同時に読者に考えさせます。

前進する

最後に、これが HTML 5 全体の内容です。 XHTMLは非常に政治的なホットポテトになり、言語を前進させたいと考えていた多くの人々が別の方向に進むことを決定しました。彼らはHTML 5の仕様を作成しました。これは現在W3Cでハッシュ化されており、次の10年のいずれかに完了する予定です。その間、ブラウザベンダーは、進行中の仕様から機能を選択して選択し、実装しています。

コメントからの更新

コメントの Alex は、何かをスニッフィングする場合は、Acceptヘッダーをチェックして、application/xhtml + xmlがユーザーエージェントによって受け入れられるかどうかを確認する必要があることを示しています。

これは完全に正しいです。一般に、スニッフィングする場合は、ブラウザではなく、機能をスニッフィングします。

110
Alan Storm

他の回答への追加:IEでは、マークアップに<span />などの要素があると、JavaScriptのDOMトラバーサルメソッドであらゆる種類の問題が発生します。次のXHTMLドキュメントをご覧ください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Test</title>
    <script type="text/javascript">
        function show() {
            var span = document.getElementById("span");
            alert(span.innerHTML);
        }
    </script>
</head>
<body onload="show();">
<p id="p1">Paragraph containing some text followed by
           an empty span<span id="span"/></p>
<p id="p2">Second paragraph just containing text</p>
</body>
</html>

ページが読み込まれると、JavaScriptは空のスパンへの参照を取得し、そのHTMLコンテンツを表示するという考え方です。空の文字列になりますよね? IEにはありません。IEでは、ドキュメント全体のスパンの後のすべてのコンテンツを取得します。

</P>
<P id=p2>Second paragraph just containing text</P>

また、2番目の<p>がスパンのchildNodesコレクションに表示されます。同じ<p>も本文のchildNodesコレクションにあります。つまり、ノードは複数の親を持つことができます。これは、DOMのトラバースに依存するスクリプトにとって、それほど良いニュースではありません。

私も これについてブログに書いた を持っています。

19
Tim Down

はい。そうです。古いブラウザでは特定のケースで問題が発生します。

<script type='text/javascript' src='script.js' />

この場合、古いブラウザは<script>タグが終了しました。

10
Mehrdad Afshari

Application/xhtml + xmlとして提供される<span />は、コンテンツのないspan要素を作成することを意味します。

Text/htmlとして提供される<span />は、</ span>タグが見つかるか、または要素を暗黙的に閉じる別のタグ(またはEOF)が見つかるまで、要素のコンテンツがこのタグの後に続くspan要素を作成することを意味します。つまり、この場合、<span />は<span>と同じ意味です。

補足:HTML 5は、HTMLとXHTMLの両方のシリアル化を定義しているため、この問題に何らかの影響はありません。 XHTML 1.0とは異なり、XHTML 1.1と同様に、XHTMLはapplication/xhtml + xmlとして提供される必要があります。しかし実際には、すべてのブラウザがtext/htmlとして提供されるXHTMLの任意のバージョンをタグスープとして扱うため、これは何も変更しません。

3
Alohci

XHMTLワーキンググループの件名に関するメモを参照してください。 http://www.w3.org/TR/xhtml-media-types/

つまり、XHTMLがXHTMLとして扱われるのであれば問題ありません。 HTMLのふりをする場合(これをInternet Explorer(バージョン8を含む)にロードする場合は、HTMLを作成するときに最新の状態にする必要があります)、フープをジャンプする必要があります。

フープは十分に迷惑で、ほとんどの人がHTML 4.01に固執することをお勧めします。

2
Quentin

また、注目に値するのは、<?xml ...?> doctypeがIEをQuirksモードにスローする前の宣言。

2
eyelidlessness

通常、空の要素に省略形を使用しても問題ありませんが、問題が発生する可能性があるいくつかの例外があります。

<script>は、問題を回避するために</script>で閉じる必要がある重要なものです。

もう1つは<meta>で、<meta></meta>の代わりに<meta />として記述されたスパイダーを使用すると、より効果的に機能します。

正確には問題ではありませんが、関連します。フォーマットに関して、IEのバージョンには、<div></div><div />などの空の要素のみで問題があります。この場合、<div>&nbsp;</div>は、フォーマットを維持するために必要です。

0
Derek H

HTMLには自己終了タグがないことを明示的に示す必要があるため、ブラウザーがXHTMLをHTMLとして扱うことを決定するたびに、タグが閉じられていることを認識しません。 <img>のように、HTMLで閉じる必要がないタグの場合は問題ありませんが、<span>のようなタグでは明らかに問題があります。

0