誰かが私をできるだけ簡単に説明できますか?古典的なDOM parentNodeとFirefox 9で新しく導入されたparentElementの違いは何ですか?
誰かが私をできるだけ簡単に説明できますか?古典的なDOM parentNodeとFirefox 9で新しく導入されたparentElementの違いは何ですか?
回答:
parentElement
はFirefox 9とDOM4の新機能ですが、他のすべての主要なブラウザに古くから存在していました。
ほとんどの場合、と同じparentNode
です。唯一の違いは、ノードparentNode
が要素でない場合です。もしそうなら、parentElement
ですnull
。
例として:
document.body.parentNode; // the <html> element
document.body.parentElement; // the <html> element
document.documentElement.parentNode; // the document node
document.documentElement.parentElement; // null
(document.documentElement.parentNode === document); // true
(document.documentElement.parentElement === document); // false
以来<html>
要素は(document.documentElement
)要素である親を持たない、parentElement
ですnull
。(可能性のあるケースは他にもありますparentElement
がnull
、に遭遇することはないでしょう。)
parentElement
はIE独自のものでした。当時、他のブラウザ(例:Netscape)はサポートされているparentNode
がサポートされていないと考えていparentElement
ます。(明らかに、Netscapeについて言及したので、IE5以前に戻る方法について話している...)
documentfragment.firstChild.parentElement === null
circle
内部などg
)では、IEはparentElement
未定義であり、parentNode
あなたが探しているものになります。:(
Internet Explorerでは、parentElement
SVG要素については未定義ですが、parentNode
は定義されています。
parentElement
以下のために実装されていないNode
だけでなく(知っているdeveloper.mozilla.org/en-US/docs/Web/API/Node/...をするために)が、SVGElement
?またdocument.createElement('svg').parentElement
、IE 11.737.17763.0ではこれを再現できませんでした。その間、これはおそらく修正されましたか?
使用して.parentElement
、ドキュメントのフラグメントを使用していない限り、問題が発生することはありません。
ドキュメントフラグメントを使用する場合は、次のものが必要です.parentNode
。
let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment
また:
let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>
どうやらのドキュメントへ<html>
の.parentNode
リンク。ノードはドキュメントに含まれるように定義されており、ドキュメントはドキュメントに含まれることができないため、ドキュメントはノードではないため、これは決定の失敗と考える必要があります。
nextSiblingおよびnextElementSiblingと同様に、名前に "element"が含まれるプロパティは常にElement
orを返すことに注意してくださいnull
。なしのプロパティは、他の種類のノードを返すことができます。
console.log(document.body.parentNode, "is body's parent node"); // returns <html>
console.log(document.body.parentElement, "is body's parent element"); // returns <html>
var html = document.body.parentElement;
console.log(html.parentNode, "is html's parent node"); // returns document
console.log(html.parentElement, "is html's parent element"); // returns null
もう1つ違いがありますが、これはInternet Explorerのみです。HTMLとSVGを混在させると発生します。親がこれら2つの「その他」の場合、.parentNodeは親を与え、.parentElementは未定義を与えます。
undefined
はないと思いますnull
。