記事「ブラウザのしくみ:最新のWebブラウザの舞台裏」を確認する必要があると思います。長い読み物ですが、時間をかける価値は十分にあります。具体的には、HTMLパーサーセクションです。
私は記事の正義を行うことはできませんが、おそらく大まかな要約は、彼らがその傑作を読んで消化する時間があるまで、1つを保持するのに良いでしょう。しかし、私はこの分野ではほとんど経験のない初心者であることを認めなければなりません。約10年間、専門的にWeb用に開発してきましたが、ブラウザーが私のコードを処理および解釈する方法は、長い間ブラックボックスでした。
HTML、XHTML、CSS、またはJavaScript-選択してください。それらはすべて文法と語彙を持っています。英語はもう一つの素晴らしい例です。人や本などが従うことを期待する文法規則があります。また、名詞、動詞、形容詞などで構成される語彙もあります。
ブラウザは、その文法と語彙を調べることによってドキュメントを解釈します。最終的に理解できない項目に遭遇すると、通知されます(例外の発生など)。あなたと私は共通して同じことをします。
私はStackOverflowが大好きですが、1つ変更できれば、絶対に壊れてしまいます...
上記の例では、単語と単語間の関係をすぐに分解し始める方法に注意してください。最初は完全に理にかなっています、「私はStackOverflowが大好きです」。それから「…変えられたら」に来て、すぐにやめます。「変更」はここに属していません。作者が代わりに「変更」を意味した可能性があります。今では語彙は正しいですが、文法は間違っています。少し後に、文法規則に違反する可能性のある「be be」に出くわし、さらに少し進んで、英語の語彙の一部ではない「absolutamente」という単語に遭遇します。これは別の間違いです。
これらすべてをDOCTYPEの観点から考えてください。私は今、2番目のモニターでXHTML 1.0StrictDoctypeの背後にあるソースを開いています。その内部には、次のような行があります。
<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
これは見出しエンティティを定義します。そして、XHTMLの文法に準拠している限り、これらのいずれかをドキュメントで使用できます(<h1>Hello World</h1>
)。しかし、私がそれを作り上げようとすると、たとえばH7
、ブラウザは「外国語」として語彙につまずき、私に通知します。
"行7、列8:要素"h7"未定義"
おそらく、ドキュメントを解析しているときに遭遇し<table
ます。現在、、などの独自の語彙セットを持つ要素を処理していることがわかります。table
言語や文法規則などを知っている限り、何かが間違っていることを知っています。XHTML 1.0 Strict Doctypeに戻ると、次のことがわかります。tbody
tr
<!ELEMENT table
(caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
<!ELEMENT caption %Inline;>
<!ELEMENT thead (tr)+>
<!ELEMENT tfoot (tr)+>
<!ELEMENT tbody (tr)+>
<!ELEMENT colgroup (col)*>
<!ELEMENT col EMPTY>
<!ELEMENT tr (th|td)+>
<!ELEMENT th %Flow;>
<!ELEMENT td %Flow;>
この参照があれば、解析しているソースに対して実行中のチェックを続けることができます。tread
作者がの代わりにを書いた場合、thead
それが誤りであると判断できる基準があります。問題が解決されておらず、文法や語彙の特定の使用法に一致するルールが見つからない場合は、そのドキュメントが無効であることを作成者に通知します。
私は決してこの科学の正義を行っているわけではありませんが、これが、この回答の冒頭として参照されている記事を座って読んだり、おそらく座ったりするのに十分であると期待しています。そして、私たちが日々遭遇するさまざまなDTDを研究します。