HTML:
<div class="a"> <p><p class="y"><p class="z"></p></p></p> </div>
コード:
console.log(document.getElementsByClassName('z')[0].parentNode)
div.aを返します
みんなを助けて、なぜそれがスキップするのか
?? ところで、pyをdiv.yに変更すると、div.yが返されます。
HTML:
<div class="a"> <p><p class="y"><p class="z"></p></p></p> </div>
コード:
console.log(document.getElementsByClassName('z')[0].parentNode)
div.aを返します
みんなを助けて、なぜそれがスキップするのか
?? ところで、pyをdiv.yに変更すると、div.yが返されます。
無効なhtmlは、スキップする理由です。段落に段落を含めることはできません。
P要素は段落を表します。ブロックレベルの要素(P自体を含む)を含めることはできません。
コンソールでHTMLを調べると、ブラウザがhtmlを書き換えて最初の段落タグを閉じることがわかります。これはブラウザがレンダリングするものです:
<div class="a">
<p></p>
<p class="y"></p>
<p class="z"></p>
<p></p>
<p></p>
</div>
A<p>
は別のの親になることはできません<p>
。各<p>
タグは、次のタグの開始時に暗黙的に終了します。終了タグは無視されます。
このように機能する他のタグもあります:<td>
そして<li>
頭に浮かぶ。(さまざまな理由がありますが、理由はマークアップの外観に同様の影響を及ぼします。)
HTMLが無効です。要素を別の要素p
の子にすることはできず、p
要素の終了タグp
はオプションです。
したがって、HTMLは次のように解釈されます。
<div class="a">
<p></p>
<p class="y"></p>
<p class="z"></p>
<!-- unexpected and therefore ignored </p> -->
<!-- unexpected and therefore ignored </p> -->
</div>
親ノードは無視されていません。作成しているHTMLは、想定しているDOMを生成していません。
段落タグ<p>
は、HTMLの特殊なケースです。以下は完全に有効なhtmlでした:
<p>this is a paragraph
<p>This is another paragraph, but notice I never closed the first one
<p>a third paragraph, also following another non-closed para
<p>a fourth one</p>
前の段落を閉じずに新しい段落を開始すると、前の段落を暗黙的に閉じます。これは、段落を相互にネストできないことを意味します。