DOM parentNode ve parentElement arasındaki fark


501

Birisi beni mümkün olduğunca basit bir şekilde açıklayabilir mi, klasik DOM parentNode ile Firefox 9 parentElement'da yeni tanıtılan arasındaki fark nedir




4
parentNode , DOM standardı gibi görünüyor, bu nedenle parentElement yerine her zaman daha güvenlidir.
TMS

5
@TMS w3school bir otorite değil: w3fools.com
Guillaume Massé

Yanıtlar:


487

parentElement Firefox 9 ve DOM4 için yenidir, ancak diğer tüm büyük tarayıcılarda uzun zamandır mevcuttur.

Çoğu durumda, aynıdır parentNode. Tek fark, bir düğümün parentNodebir eleman olmadığı zaman gelir . Eğer öyleyse, parentElementöyle null.

Örnek olarak:

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

İtibaren <html>elemanın ( document.documentElement) bir eleman olan bir üst sahip değildir, parentElementbir null. (Olası parentElementolabilecek başka durumlar da var null, ancak muhtemelen bunlarla hiç karşılaşmayacaksınız.)


162
Başka bir deyişle, zamanın% 99.999999999999'u anlamsızdır. Kimin fikriydi?
Niet the Dark Absol

25
Orijinal parentElementtescilli bir IE şeydi; O zaman diğer tarayıcıların (örneğin, Netscape) desteklendiğine inanıyorum parentNodeama desteklemiyorum parentElement. (Açıkçası, Netscape'ten bahsettiğim gibi, IE5 ve öncesine giden yoldan bahsediyorum ...)
nnnnnn

9
@lonesomeday unuttundocumentfragment.firstChild.parentElement === null
Raynos

7
@Raynos Bu, cevabımın son cümlesini aklımda tuttuğum kesin durumdu ...
lonesomeday

17
Az önce keşfettiğim gibi , IE'de bir SVG öğesinde (bir circleiç a gibi g) parentElementtanımsız parentNodeolacak ve aradığınız şey olacak. :(
Jason Walton

94

Internet Explorer'da, parentElementSVG öğeleri parentNodeiçin tanımlanmamıştır.


10
dürüst olmak gerekirse bu bir cevaptan ziyade bir yorumdur.
shabunc

38
Muhtemelen, ama anladım kadar kafamı masaya bir saat veya daha fazla vurdum. Başkalarının da benzer bir kafa vurmasından sonra bu sayfaya geldiğinden şüpheleniyorum.
speedplane

3
@speedplane Bu mantıklı bir anlam ifade etmiyor ve beni iyi bir süre için stumped gibi bir cevap bu ...
superphonic

1
Ayrıca yorum düğümleri için tanımsızdır. Chrome'da mutlu bir şekilde yorumun üstünü alıyordum, ancak IE'de tanımsızdı.
Simon_Weaver

Bunun için bir kaynak bulamadım. parentElementuygulanmadığı Nodeiyi bilinir ( developer.mozilla.org/en-US/docs/Web/API/Node/… ) ama SVGElement? Bunu document.createElement('svg').parentElementIE 11.737.17763.0 ile de çoğaltamadım. Bu arada belki düzeltildi mi?
epsilon

14

Kullanın .parentElementve belge parçaları kullanmadığınız sürece yanlış gidemezsiniz.

Belge parçalarını kullanıyorsanız, aşağıdakilere ihtiyacınız vardır .parentNode:

let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment

Ayrıca:

let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>


Görünüşe göre <html>' Belgeye.parentNode bağlantılar . Belgeler düğümleri yana düğümlerin değildir bu bir karar phail düşünülmelidir tanımlandığı dokümanlarla yer olamaz belge ve belgelerle containable olması.


6

NextSibling ve nextElementSibling gibi, adlarında "element" bulunan özelliklerin her zaman Elementveya döndürdüğünü unutmayın null. Olmayan özellikler başka bir düğüm türünü döndürebilir.

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
evet, ancak bitişik metin veya yorum düğümlerinin aksine üst öğe olamaz.
Jasen

0

bir fark daha var, ama sadece internet explorer'da. HTML ve SVG'yi karıştırdığınızda oluşur. üst öğe bu ikisinin 'diğeri' ise, .parentNode üst öğeyi verirken .parentElement tanımsız verir.


1
Bence undefineddeğil null.
Brian Di Palma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.