ブラウザが正しく認識しない理由は何ですか:
<script src="foobar.js" /> <!-- self-closing script element -->
これだけが認識されます:
<script src="foobar.js"></script>
これは XHTML サポートの概念を壊しますか?
注: この記述は、少なくともすべての IE (6-8 ベータ 2) に対して正しいものです。
ブラウザが正しく認識しない理由は何ですか:
<script src="foobar.js" /> <!-- self-closing script element -->
これだけが認識されます:
<script src="foobar.js"></script>
これは XHTML サポートの概念を壊しますか?
注: この記述は、少なくともすべての IE (6-8 ベータ 2) に対して正しいものです。
XHTML 1 仕様の非規範的な付録「HTML 互換性ガイドライン」には、次のように記載されています。
コンテンツ モデルがそうでない要素の空のインスタンス
EMPTY
(たとえば、空のタイトルや段落) が与えられた場合、最小化されたフォームを使用しないでください (たとえば、 use<p> </p>
and not<p />
)。
XHTML DTDはスクリプト要素を次のように指定します。
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
Brad とスクワデットが言ったことに付け加えると、セルフクロージング XML 構文<script />
は実際にはapplication/xhtml+xml
正しい XML ですが、実際に機能させるためには、Web サーバーは文書をHTTP のような XML mimetype を持つ適切に形成された XML として送信する必要もあります。 Content-Type ヘッダー (およびasではありませんtext/html
)。
ただし、XML mimetype を送信すると、IE7 でページが解析されなくなりますtext/html
。
w3から:
要約すると、「application/xhtml+xml」は XHTML ファミリ ドキュメントに使用する必要があり、「text/html」の使用は HTML 互換の XHTML 1.0 ドキュメントに限定する必要があります。「application/xml」と「text/xml」も使用できますが、必要に応じて、これらの一般的な XML メディア タイプではなく、「application/xhtml+xml」を使用する必要があります。
私は数ヶ月前にこれに戸惑いましたが、唯一の実行可能な (FF3+ および IE7 と互換性のある) 解決策は、 (HTML 構文 + HTML mimetype)で古い<script></script>
構文を使用することでした。text/html
サーバーtext/html
が HTTP ヘッダーでタイプを送信する場合、適切に形成された XHTML ドキュメントであっても、FF3+ は HTML レンダリング モードを使用するため、動作し<script />
ません (これは変更であり、Firefox は以前はそれほど厳密ではありませんでした)。
これはhttp-equiv
、ドキュメント内のメタ要素、XML プロローグ、または doctype をいじっていても発生します。Firefox はtext/html
ヘッダーを取得すると分岐し、HTML または XML パーサーがドキュメント内を検索するかどうかを決定し、HTML パーサーは理解できません<script />
。
他の人は「どのように」と答え、仕様を引用しています。<script/>
バグレポートやメーリングリストを何時間も掘り下げた結果、「なぜだめなのか」の本当の話がここにあります。
HTML4
HTML 4 はSGMLに基づいています。
SGML には、、、、またはなどの<BR//
ショートタグがあります。XML は最初の形式を取り、末尾を ">" (SGML は柔軟) に再定義して、 になります。<B>text</>
<B/text/
<OL<LI>item</LI</OL>
<BR/>
ただし、 HTMLは再定義されてい<SCRIPT/>
ない ため、<SCRIPT>>
.
(はい、「>」はコンテンツの一部である必要があり、タグはまだ閉じられていません。)
明らかに、これはXHTML と互換性がなく、多くのサイトが機能しなくなります(ブラウザが十分に成熟 してこれに対応できるようになるまでには) 。
事実上、すべての「機能する」自己終了タグは、技術的に非準拠のパーサーで禁止されている終了タグを持つタグであり、実際には無効です。XHTML をHTML 互換にすることで XHTML への移行を支援するために、このハックを思いついたのは W3C でした。
And<script>
の終了タグは禁止されていません。
「自己終了」タグは HTML 4 のハックであり、意味がありません。
HTML5
HTML5 には5 種類のタグがあり、「void」タグと「foreign」タグのみが自己終了として許可されます。
<script>
は void ではなく (コンテンツを持っている可能性があります)、外部 (MathML や SVG など) ではないため<script>
、使用方法に関係なく、自己クローズできません。
しかし、なぜ?彼らはそれを外国と見なしたり、特別なケースを作ったりすることはできませんか?
HTML 5 は、HTML 4 および XHTML 1 の実装との下位互換性を維持することを目的としています。これは、SGML または XML に基づいていません。その構文は、主に文書化と実装の統合に関係しています。(これが、無効な HTML4 にもかかわらず、有効な HTML 5である理由です。)<br/>
<hr/>
自己閉鎖<script>
は、実装が異なっていたタグの 1 つです。以前は Chrome、Safari、および Operaで動作していました。私の知る限り、Internet Explorer や Firefox では機能しませんでした。
これは、HTML 5 の草案が作成されたときに議論され、ブラウザの互換性が損なわ れるため却下されました。スクリプト タグを自己終了する Web ページは、古いブラウザーでは (まったく) 正しくレンダリングされない場合があります。他の提案もありましたが、互換性の問題も解決できません。
ドラフトがリリースされた後、WebKit はパーサーを準拠するように更新しました。
HTML 4 および XHTML 1 との下位互換性があるため、HTML 5 ではセルフクロージング<script>
は発生しません。
XHTML 1 / XHTML 5
他の回答が述べているように、実際に XHTML として提供されると、<script/>
実際には閉じられます。
HTMLとして提供されたときに機能するはずであると仕様に記載されていることを除いて:
XHTML ドキュメント ... は、ほとんどの HTML ブラウザと互換性があるため、インターネット メディア タイプ「text/html」[RFC2854] のラベルを付けることができます。
どうしたの?
Mozillaは、指定されたコンテンツ ヘッダーに関係なく、適合するドキュメントをFirefox にXHTMLとして解析させるようにMozilla に依頼しました (コンテンツ スニッフィングとして知られています)。これにより、自己終了スクリプトが可能になり、Web ホスティング業者が正しいヘッダーを提供できるほど成熟していなかったため、とにかくコンテンツ スニッフィングが必要でした。IEはそれが得意でした。
最初のブラウザー戦争が IE 6 で終わらなかったとしたら、XHTML もリストに含まれていた可能性があります。しかし、それは終わりました。また、IE 6にはXHTMLに関する問題があります。実際、IEは正しい MIME タイプをまったくサポートしていませんでした。IE は 10 年間にわたって主要な市場シェアを保持していたため、誰もが XHTMLを使用することを余儀なくされました。text/html
また、コンテンツ スニッフィングは非常に 悪質であり、人々はそれをやめるべきだと言っています。
最後に、W3Cは XHTML がスニッフィング可能であることを意味していなかったことが判明しました。ドキュメントは、HTML と XHTML の両方Content-Type
であり、ルールでもあります。彼らは「私たちの仕様に従うだけ」に固執し、実用的なことを無視していたと言えます。後の XHTML バージョンに引き継がれた間違い。
とにかく、この決定は Firefoxの問題を解決しました。Chromeが誕生するのは 7 年前のことです。他に重要なブラウザはありませんでした。ということで決まりました。
doctype だけを指定しても、次の仕様により XML 解析はトリガーされません。
興味のある方のために説明すると、最終的な理由は、HTML が元々、XML の奇妙な兄である SGML の方言だったからです。SGML ランドでは、DTD で要素を自己終了 (BR、HR、INPUT など)、暗黙的に終了可能 (P、LI、TD など)、または明示的に終了可能 (TABLE、DIV、SCRIPT など) として指定できます。もちろん、XML にはこのような概念はありません。
最新のブラウザーで使用されるタグスープ パーサーは、このレガシーから進化しましたが、その解析モデルはもはや純粋な SGML ではありません。そしてもちろん、慎重に作成された XHTML は、XML MIME タイプで送信しない限り、SGML にインスパイアされた不適切に記述されたタグスープとして扱われます。これもなぜか…
<p><div>hello</div></p>
...ブラウザによって次のように解釈されます。
<p></p><div>hello</div><p></p>
...これは、DOM に対してコードを作成しようとすると、うまくいかなくなる可能性がある、あいまいなバグのレシピです。
Internet Explorer 8以前は、XHTML解析をサポートしていません。XML宣言やXHTMLDoctypeを使用している場合でも、古いIEはドキュメントをプレーンHTMLとして解析します。また、プレーンHTMLでは、自己終了構文はサポートされていません。末尾のスラッシュは無視されます。明示的な終了タグを使用する必要があります。
IE 9以降などのXHTML解析をサポートするブラウザーでも、XMLコンテンツタイプでドキュメントを提供しない限り、ドキュメントはHTMLとして解析されます。ただし、その場合、古いIEはドキュメントをまったく表示しません。
上記の人々はすでにこの問題についてかなり説明していますが、物事を明確にするかもしれないことの1つは、人々<br/>
はHTMLドキュメントで常になどを使用していますが、/
そのような位置にあるものは基本的に無視され、作成しようとする場合にのみ使用されるということです. XML と HTML の両方で解析可能なもの。<p/>foo</p>
たとえば、試してみると、通常の段落が得られます。
スクリプト タグにはインライン コードを含めることができ、HTML は属性の存在に基づいてその機能をオンまたはオフにするほどスマートではないため、自己終了スクリプト タグは機能しません。
一方、HTML には、外部リソースへの参照を含めるための優れたタグ、
<link>
タグがあり、自己終了することができます。スタイルシート、RSS および Atom フィード、正規 URI、およびその他のあらゆる種類の機能を含めるために既に使用されています。なぜ JavaScript を使わないのですか?
スクリプト タグを自己完結型にしたい場合は、私が言ったようにそれを行うことはできませんが、賢いものではありませんが、別の方法があります。以下のように、タイプ text/javascript と rel as script を指定することで、セルフ クロージング リンク タグと JavaScript へのリンクを使用できます。
<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
XML や XHTML とは異なり、HTML には自己終了構文に関する知識がありません。XHTML を HTML として解釈するブラウザーは/
、タグが自己終了する必要があることを文字が示していることを認識しません。代わりに、空の属性のように解釈し、パーサーはタグが「開いている」と見なします。
がとして<script defer>
扱われるよう<script defer="defer">
に、<script />
は として扱われ<script /="/">
ます。
Internet Explorer 8 以前は、XHTML の適切な MIME タイプをサポートしていませんapplication/xhtml+xml
。text/html
これらの古いバージョンの Internet Explorer で何かを行うために必要なXHTML を として提供している場合、HTML 4.01 として解釈されます。短い構文は、終了タグを省略できる要素でのみ使用できます。HTML 4.01 仕様を参照してください。
XML の「短い形式」は / という名前の属性として解釈され、(等号がないため) 暗黙の値「/」を持つものとして解釈されます。これは HTML 4.01 では厳密に間違っています。宣言されていない属性は許可されていませんが、ブラウザーはそれを無視します。
IE9 以降では、で提供されるXHTML 5 がサポートされapplication/xhtml+xml
ます。
HTML ドキュメント- VOID ELEMENTSには「終了タグ」はまったく必要ありません。
xhtmlでは、すべてがジェネリックであるため、「終了タグ」などの終了が必要です。単純な改行である br を含む as<br></br>
またはその短縮形 <br />
.
ただし、スクリプト要素が無効またはパラメトリック要素になることはありません。これは、何よりもまずスクリプト タグがブラウザ命令であって、データ記述宣言ではないためです。
原則として、「終了タグ」などのセマンティック終了命令は、後続のタグでセマンティックを終了できない命令を処理する場合にのみ必要です。例えば:
<H1>
セマンティクスは<P>
、オーバーライドするのに十分な独自のセマンティクスを持っていないため、前の H1 命令セットを終了することはできません。ストリームを新しい段落行に分割することはできますが、現在のフォント サイズとスタイルの行の高さをオーバーライドしてストリームを流し込む、つまり H1 から漏れるほど「十分に強力」ではありません (P にはそれがないため)。 )。
これが、"/" (終了) シグナリングが発明された方法と理由です。
、のような一般的な説明のない終了タグは< />
、遭遇したカスケードからの単一のフォールオフには十分でし<H1>Title< />
た.別のカスケードに巻き付く/落ちる前に急流に。結果として、 などの汎用ターミネータ< />
は、終了するプロパティのターゲットを決定できません。例:<b>
ボールド <i>
ボールド イタリック < />
イタリック </>
通常。間違いなく私たちの意図を正しく理解することができず、おそらくそれをボールドボールド イタリックボールドノーマルと解釈するでしょう。
これが、ラッパー、つまりコンテナーの概念が生まれた方法です。(これらの概念は非常に似ているため、識別が不可能であり、同じ要素に両方が含まれている場合があります。<H1>
はラッパーとコンテナーの両方を同時に持ちます。一方<B>
、セマンティック ラッパーのみです)。プレーンでセマンティクスのないコンテナが必要です。そしてもちろん、DIV エレメントの発明が実現しました。
DIV 要素は、実際には 2BR-Container です。もちろん、CSS の登場により、全体の状況は、それ以外の場合よりも奇妙になり、多くの大きな結果を伴う大きな混乱を引き起こしました - 間接的に!
CSS を使用すると、新しく発明された DIV のネイティブの前後の BR 動作を簡単にオーバーライドできるため、「何もしないコンテナー」と呼ばれることがよくあります。これは、当然間違っています。DIV はブロック要素であり、終了シグナルの前後でネイティブにストリームの行を分割します。すぐに WEB はページ DIV-itis に悩まされ始めました。それらのほとんどはまだです。
任意の HTML タグのネイティブな動作を完全にオーバーライドし、完全に再定義する機能を備えた CSS の登場により、どういうわけか、HTML の存在の全体的な意味を混乱させ、あいまいにすることができました...
突然、すべての HTML タグが時代遅れのように見え、改ざんされ、元の意味、アイデンティティ、および目的がすべて剥奪されました。どういうわけか、それらはもう必要ないという印象を受けるでしょう. 言い方: 単一のコンテナー ラッパー タグで、すべてのデータ表示に十分です。必要な属性を追加するだけです。代わりに意味のあるタグを付けないでください。必要に応じてタグ名を考案し、残りは CSS に任せます。
これが xhtml が生まれた方法であり、もちろん、新規参入者と何が何であるか、そしてそのすべての目的は何かについての歪んだビジョンによって非常に大きな代償を払われました。W3C は World Wide Web から What Went Wrong になりましたか? !!
HTML の目的は、意味のあるデータを人間の受信者にストリーミングすることです。
情報を配信するため。
正式な部分は、情報伝達の明確さを支援するためだけにあります。xhtml はこの情報をまったく考慮していません。- それには、情報はまったく関係ありません。
この問題で最も重要なことは、xhtml が単なる拡張 HTML のバージョンではなく、xhtml がまったく別の獣であることを知り、理解できるようにすることです。根拠があります。したがって、それらを分離しておくことが賢明です。
単純に現代的な答えは、タグがそのように必須として示されているためです
タグの省略なし。開始タグと終了タグの両方が必須です。
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script