ブラウザが正しく認識しない理由は何ですか:
<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仕様では、
コンテンツモデルではない要素の空のインスタンス
EMPTY
(たとえば、空のタイトルまたは段落)を指定すると、最小化されたフォーム(たとえば、use<p> </p>
とnot<p />
)を使用しません。
XHTML DTDは、スクリプト要素を次のように指定します。
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
<script />
は、仕様で許可されていないことではありませんが、コンテンツタイプがapplication / xhtml + xmlでない場合、ブラウザはそれを「non-tag-soup」と解釈しません。参照:stackoverflow.com/questions/348736/…@shabunc :ブラウザーはそれを理解しているように見えるかもしれませんが、実際に起こっているのは、スクワッドの引用を解釈するために、段落内の <p />の後にコンテンツを配置しています。 p>は空ではないため、自己終了できません。XHTML 1.1では、自己終了することができます。
ブラッドとスクワッドが言ったことに追加するには、自己終了XML構文は<script />
実際には正しいXMLですが、実際に機能させるには、Webサーバーもapplication/xhtml+xml
HTTPのようなXML MIMEタイプで適切に形成されたXMLとしてドキュメントを送信する必要がありますContent-Typeヘッダー(としてではなくtext/html
)。
ただし、XML MIMEタイプを送信すると、IE7でページが解析されなくなりますtext/html
。
w3から:
要約すると、「application / xhtml + xml」はXHTMLファミリドキュメントに使用する必要があり(SHOULD)、「text / html」の使用はHTML互換のXHTML 1.0ドキュメントに限定する必要があります(SHOULD)。「application / xml」と「text / xml」も使用できますが、適切な場合は、これらの汎用XMLメディアタイプではなく「application / xhtml + xml」を使用する必要があります。
私はこれを数か月前に戸惑いました、そして唯一の実行可能な(FF3 +およびIE7と互換性のある)解決策は、古い<script></script>
構文を使用することでした。text/html
(HTML構文+ HTML mimetype)で。
サーバーtext/html
がHTTPヘッダーでタイプを送信すると、適切に形成されたXHTMLドキュメントであっても、FF3 +はHTMLレンダリングモードを使用します。<script />
ないます(これは変更であり、Firefoxは以前はそれほど厳密はありませんでした)
これはhttp-equiv
、ドキュメント内のメタ要素、XMLプロローグまたはdoctypeのいじりに関係なく発生します。Firefoxがtext/html
ヘッダーを取得すると分岐し、HTMLまたはXMLパーサーがドキュメント内を調べ、HTMLパーサーがを理解しません<script />
。
.html
、同様の理由で、メタタグに関係なく、Firefoxでもローカルファイルがタグスープとしてレンダリングされることです。XHTMLファイルの場合、Firefoxは名前が付けられている場合にのみそれに応じてレンダリングします.xhtml
。
application/xhtml+xml
、ではありませんtext/xml
。
誰かが気になる場合は、究極の理由は、HTMLがもともとSGMLの方言だったということです。これはXMLの奇妙な兄です。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に対してコード化しようとするときに適合に陥る可能性のある素敵なあいまいなバグのレシピです。
P
要素を含めることはできませんDIV
ブラウザはので、(これは無効なHTMLである)の要素を暗黙的にクローズするP
開口部の前に(「暗黙的に閉じることができる」と定義)の要素をDIV
タグ。ただし、ブラウザはこの点で異なる動作をする傾向があります(無効なHTMLの場合と同様)。
</p>
一方、欠落している終了タグは、実際にはHTMLの定義の一部です。
他の人は「方法」に答え、仕様を引用しています。<script/>
バグレポートとメーリングリストを何時間も掘り下げた後の、「なぜ駄目なのか」の本当の話です。
HTML 4
HTML 4はSGMLに基づいています。
SGMLはいくつかありshorttagsなどを、<BR//
、<B>text</>
、<B/text/
、または<OL<LI>item</LI</OL>
。XMLは最初の形式を取り、末尾を ">"として再定義します(SGMLは柔軟です)<BR/>
。
ただし、HTMLはredfineしなかったため、<SCRIPT/>
を意味するはずです <SCRIPT>>
。
(はい、 '>'はコンテンツの一部である必要があり、タグはまだ閉じられていません。)
明らかに、これはXHTMLと互換性がなく、多くのサイトを壊します(ブラウザがこれを気に するのに十分成熟した頃には)ので、誰もショートタグを実装していません。
事実上、すべての「機能する」自己終了タグは、技術的に非準拠のパーサーで禁止された終了タグを持つタグであり、実際には無効です。このハックを思いついたのはW3Cで、XHTMLへの移行を支援しました。 HTML互換に。
また、<script>
終了タグは禁止されていません。
「自己終了」タグはHTML 4のハックであり、意味がありません。
HTML 5
HTML5には5種類のタグがあり、「void」および「foreign」タグのみがが自己終了できますます。
ので<script>
、それは(空ではないかもしれませんコンテンツを持っている)と、(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はパーサーを準拠するように更新しました。
<script>
HTML 4およびXHTML 1との下位互換性があるため、HTML 5では自己終了は発生しません。
XHTML 1 / XHTML 5
ときは本当に XHTMLを務め、<script/>
本当にとして、閉じられている他の回答述べました。
仕様が HTMLとして提供されたときに機能するはずであると述べていることを除いて:
XHTMLドキュメント...は、ほとんどのHTMLブラウザと互換性があるため、インターネットメディアタイプ「text / html」[RFC2854]でラベル付けされる場合があります。
どうしたの?
人々はMozillaに、指定されたコンテンツヘッダー(コンテンツスニッフィングと呼ばれる)に関係なく、Firefoxが適合ドキュメントをXHTMLとして解析するように要求しました。これは自己完結型のスクリプトを許可し、Webホスティング業者は適切なヘッダーを提供するのに十分成熟していないため、とにかくコンテンツスニッフィングが必要でした。IEはそれでよかった。
最初のブラウザ戦争がIE 6で終わらなかった場合、XHTMLもリストに含まれている可能性があります。しかし、それは終わりました。また、IE 6には XHTML に関する問題があります。実際、IE は正しいMIMEタイプをまったくサポートしていませんでした。IEが大きな市場シェアを保持していたため、全員がtext/html
XHTML を使用する必要がありました。全体の十年。
また、コンテンツの盗聴は 非常に悪い場合があり、人々はそれを止めるべきだと言っています。
最後に、W3C がXHTMLを盗聴できることを意味していないことがわかりました。ドキュメントはHTMLとXHTMLの両方であり、Content-Type
ルールです。彼らは「私たちの仕様に従うだけ」に固く立ち、何が実用的であったかを無視していたと言えます。続く間違い以降のXHTMLバージョンに。
とにかく、この決定はFirefox の問題を解決しました。Chrome が誕生する 7年前です。他に重要なブラウザはありませんでした。したがってそれが決定されました。
doctypeだけを指定しても、以下の仕様のため、XML解析はトリガーされません。
<p>
または<li>
、彼らは以来の自己閉じ'にすることはできませんすることができますようなコードので、コンテンツを持っている<p/>
(不正な形式)ということの何物でもありません、それがこの要素で許可されている場合、それは後にタグやコンテンツをスタート、最終的にはその内部になります。
Internet Explorer 8以前は、XHTML解析をサポートしていません。XML宣言やXHTML Doctypeを使用しても、古いIEはプレーンHTMLとしてドキュメントを解析します。プレーンHTMLでは、自己終了構文はサポートされていません。末尾のスラッシュは無視されます。明示的な終了タグを使用する必要があります。
IE 9以降など、XHTML解析をサポートしているブラウザでも、XMLコンテンツタイプでドキュメントを提供しない限り、ドキュメントをHTMLとして解析します。ただし、その場合、古いIEではドキュメントがまったく表示されません。
自動終了スクリプトタグは機能しません。スクリプトタグにはインラインコードを含めることができ、HTMLは、属性の存在に基づいてその機能をオンまたはオフにするほどスマートではないためです。
一方、HTMLには外部リソースへの参照を含めるための優れたタグがあります。この
<link>
タグは、自己終了することができます。スタイルシート、RSSフィード、Atomフィード、正規URI、その他のあらゆる種類のアイテムを含めるために既に使用されています。なぜJavaScriptではないのですか?
スクリプトタグを自己完結させたい場合は、私が言ったようにそれを行うことはできませんが、賢い方法ではありませんが、代替手段があります。自己終了リンクタグを使用してJavaScriptにリンクするには、次のように、スクリプトにテキスト/ JavaScriptとrelのタイプを指定します。
<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
<style>
タグがありますが、外部CSSファイルにはリンクタグを使用します。リンクタグの定義:「<link>タグは、ドキュメントと外部リソース間のリンクを定義します。」リンクタグが外部CSSまたはJSに使用されることは完全に論理的であるようです。スペック/クロスブラウザ性などについて話していないことに注意してください。CSSとJSの両方を導入するためにリンクタグを使用することの論理的な性質についてコメントしているだけです... 。靴[アナロジー]が合うかどうかわからない。
XMLやXHTMLとは異なり、HTMLには自己終了構文に関する知識がありません。XHTMLをHTMLとして解釈するブラウザーは、/
文字がタグが自己終了であることを示していることを。代わりに、それらは空の属性のように解釈され、パーサーはタグがまだ「オープン」であると見なします。
と同様<script defer>
に扱われ<script defer="defer">
、<script />
として扱われ<script /="/">
ます。
/
は、NET(Null End Tag)構成の一部として解釈する場合があります。
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要素がありませんすべてで「終了タグ」が必要!
では、XHTML、すべてが、一般的であるため、彼らはすべての必要性の終了例えばA「終了タグ」。br、単純な改行、<br></br>
またはその短縮形を含む <br />
。
ただし、スクリプトタグは、スクリプトタグであるため、ボイドまたはパラメトリックエレメントになることはありません。は何よりもブラウザインストラクションであり、データ記述宣言ではありません。
主に、「終了タグ」などのセマンティック終了命令は、セマンティクスが後続のタグで終了できない命令を処理する場合にのみ必要です。例えば:
<H1>
セマンティクスは<P>
、それ自体のセマンティクスをオーバーライドしてそれによって前のH1命令セットを終了するのに十分な量を持たないため、フォローによって終了することはできません。それは破ることができるようになりますが、ストリームを新しい段落の行には、現在のフォントサイズ&スタイル行の高さを上書きする「十分に強い」ではありません下流に注ぎますすなわち、H1から漏れた(Pはそれを持っていないので、 )。
これが、「/」(終了)シグナリングが発明された方法と理由です。
のような一般的な説明なしの終了タグは< />
、遭遇したカスケードからの単一のフォールに十分です<H1>Title< />
。別のカスケードにラップ/フォールする前に急流に。結果として、などの汎用ターミネーター< />
は、終了するプロパティのターゲットを決定できません。例:<b>
ボールド <i>
ボールドイタリック < />
イタリック </>
ノーマル。間違いなく私たちの意図を正しく理解できず、おそらくそれを大胆な太字の斜体の太字の正常なものとして解釈するでしょう。
これは、ラッパー、つまりコンテナの概念が生まれた方法です。(これらの概念は非常に似ているため、識別できず、同じ要素に両方<H1>
が含まれる場合があります。同時にラッパーとコンテナの両方になります。一方<B>
、セマンティックラッパーのみです)。意味のないプレーンなコンテナーが必要です。そしてもちろん、DIVエレメントの発明が生まれました。
DIV要素は実際には2BRコンテナです。もちろん、CSSの登場により、状況全体が他の状況よりも奇妙になり、多くの重大な結果を伴う大きな混乱を引き起こしました-間接的に!
CSSを使用すると、新しく発明されたDIVのネイティブの前後のBR動作を簡単にオーバーライドできるため、「何もしないコンテナー」と呼ばれることがよくあります。これは当然のことです!DIVはブロック要素であり、終了のシグナリングの前後の両方でネイティブにストリームの行を分割します。間もなくWEBはDIV-itisページに悩まされ始めました。それらのほとんどはまだです。
HTMLタグのネイティブな動作を完全にオーバーライドして完全に再定義する機能を備えたCSSの登場により、HTMLの存在の意味全体を混乱させ、不鮮明にすることができました...
突然、すべてのHTMLタグが古くなったように見え、元の意味、アイデンティティ、目的がすべて取り除かれ、改ざんされました。どういうわけか、あなたはそれらがもはや必要ではないという印象を得るでしょう。説明:すべてのデータ表示には、単一のコンテナーラッパータグで十分です。必要な属性を追加するだけです。代わりに意味のあるタグがないのはなぜですか。あなたが行くときにタグ名を考え出して、CSSが残りの部分に悩まされるようにしましょう。
これは、xhtmlが生まれた方法であり、もちろん大きな鈍器であり、新しい参入者と何が何であり、何がそのすべてのいまいましい目的であるかについての歪んだビジョンによって大いに支払われました。W3Cは、World Wide Webから「仲間達はどうしたの?」
HTMLの目的は、意味のあるデータを受信者にストリーミングすることです。
情報を提供するため。
正式な部分は、情報配信の明確さを支援するためだけにあります。xhtmlは情報を少しでも考慮しません。-それに対して、情報は絶対に無関係です。
この問題で最も重要なことは、xhtmlが拡張されたHTMLの単なるバージョンではなく、xhtmlはまったく異なる獣であることを知り、理解できるようにすることです。根拠; したがって、それらを分離しておくのが賢明です。
「true XHTML」、「faux XHTML」、およびHTMLの違いと、サーバーが送信するMIMEタイプの重要性については、すでにここで説明しています。今すぐ試してみたい場合は、次の簡単な編集可能なスニペットで、ライブプレビューに対応したブラウザ用の自己クローズスクリプトタグを含めます。
div { display: flex; }
div + div {flex-direction: column; }
<div>Mime type: <label><input type="radio" onchange="t.onkeyup()" id="x" checked name="mime"> application/xhtml+xml</label>
<label><input type="radio" onchange="t.onkeyup()" name="mime"> text/html</label></div>
<div><textarea id="t" rows="4"
onkeyup="i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)"
><?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[<!ENTITY x "true XHTML">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<p>
<span id="greet" swapto="Hello">Hell, NO :(</span> &x;.
<script src="data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')" />
Nice to meet you!
<!--
Previous text node and all further content falls into SCRIPT element content in text/html mode, so is not rendered. Because no end script tag is found, no script runs in text/html
-->
</p>
</body>
</html></textarea>
<iframe id="i" height="80"></iframe>
<script>t.onkeyup()</script>
</div>
Hello, true XHTML. Nice to meet you!
以下のテキストエリアが表示されます。
対応していないブラウザの場合は、textareaのコンテンツをコピーして、拡張子.xhtml
(または.xht
)のファイルとして保存できます(このヒントを提供してくれたAlekに感謝します)。
単に現代的な答えは、タグがそのように必須として示されているためです
タグの省略なし。開始タグと終了タグの両方が必須です。
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script