26

どうやら、要素</p>内に一致する開始タグがない終了タグがあるbody場合、すべてではないにしてもほとんどのブラウザーがその場所に空の段落を生成します。

<!DOCTYPE html>
<title></title>
<body>
</p>
</body>

終了タグの周りにテキストが存在する場合でも、このp要素の一部にはなりません — 常に空であり、テキスト ノードは常に単独で存在します。

<!DOCTYPE html>
<title></title>
<body>
some text</p>more text
</body>

の上記の内容がbodyと タグで囲まれている<p>場合</p>...どうなるかはあなたにお任せします:

<!DOCTYPE html>
<title></title>
<body>
<p>some text</p>more text</p>
</body>

興味深いことに、タグの</p>前に<body>or</body>タグがない場合、IE9 以前を除くすべてのブラウザーは空の段落を生成しません(一方、IE ≤ 9 では常に空の段落が作成されますが、IE10 以降は他のすべてのブラウザーと同じように動作します)。 :

<!DOCTYPE html>
<title></title>
</p>
<!DOCTYPE html>
<title></title>
</p><body>
<!DOCTYPE html>
<title></title>
</p></body>

対応する開始タグのない終了タグが空の要素を生成する必要があることを規定する参照は見つかりませんが、そもそも有効な HTML でさえないことを考えると、驚くべきことではありません。p実際、ブラウザーが要素 (およびある程度要素も!)を使用してこれを行うことはわかっていますが、brその理由についての説明はありません。

ただし、従来の HTML パーサーと HTML5 パーサーの両方を使用するブラウザー間で一貫性があり、quirks モードと標準モードの両方に適用されます。したがって、これは初期の仕様または従来の動作との下位互換性のためであると推測するのはおそらく公正です。

実際、多少関連する質問への回答でこのコメントを見つけました。これは基本的にそれを確認します。

<p> タグが閉じられていない場合に有効である理由は、もともと <p> がコンテナー要素ではなく、"新しい段落" マーカーとして定義されていたためです。<br> が「改行」マーカーであることと同等です。1992年のこのドキュメントでそのように定義されていることがわかります。 org/MarkUp/draft-ietf-iiir-html-01.txt変更前の Web ページがあり、ブラウザ パーサーは常に既存の Web コンテンツと可能な限り下位互換性を保っていたため、常に <p> を使用できます。その方法。

</p>しかし、パーサーが明示的な終了タグ (スラッシュ付き) を単純に... タグとして扱い、DOM に空の要素を生成する理由を完全には説明していません。これは、構文が最近ほど 厳密に定義されていなかったときからのパーサーエラー処理規則の一部ですか? もしそうなら、それはどこかに文書化されていますか?

4

2 に答える 2

20

必須であることは、HTML5 で文書化されています。http://w3c.github.io/html/syntax.html#the-in-body-insertion-modeを参照して検索するAn end tag whose tag name is "p"と、次のように表示されます。

開いている要素のスタックに、ボタン スコープ内にトークンと同じタグ名を持つ要素がない場合、これは解析エラーです。タグ名「p」の開始タグが検出されたかのように動作し、現在のトークンを再処理します。

英語に翻訳すると、タグが既存のタグと一致しないp場合に要素を作成することを意味します。</p><p>

なぜそうなのか、確認するのは難しいです。通常、これは、過去の一部のブラウザーがバグとしてこれを引き起こし、Web ページがその動作に依存するようになったため、他のブラウザーも実装する必要があったためです。

于 2012-07-19T23:53:07.640 に答える
1

HTML4 DTDは、段落要素の終了タグはオプションですが、開始タグは必須であると述べています。

HTML4のSGML 宣言では、omittagが「yes」であると述べられています。これは、開始タグを暗示できることを意味します。

終了タグはSGML規則に従います。

終了タグが終了し、一致する開始タグに戻り、終了タグが省略されたすべての閉じられていない介在する開始タグ

匿名ブロック ボックスは、テキスト ノードなどのインライン要素に対して生成されるため、段落要素でラップする必要はありません。

Mozilla バグ データベースには、この動作を説明するスレッドがあります。

これは、 Boris Zbarskyによる関連するコメントです。

実際、私が理解しているように、SGML/HTML を適切に解析するには、このように動作する必要があります。つまり、次のタグの「<」は、前のタグのマークアップを閉じる有効な方法です...

Ian Hicksonによって要約されました。

ここでの基本原則は、他のすべての開いている要素が閉じられるまで終了タグを遅らせることによってマークアップを修正し、DOM を HTML DTD に従わせようとしないことです。

参考文献

于 2012-08-18T17:17:00.110 に答える