Alguém pode me explicar da forma mais simples possível, qual é a diferença entre o DOMN clássico do pai e o recém-introduzido no Firefox 9 parentElement
Alguém pode me explicar da forma mais simples possível, qual é a diferença entre o DOMN clássico do pai e o recém-introduzido no Firefox 9 parentElement
Respostas:
parentElement
é novo no Firefox 9 e no DOM4, mas está presente em todos os outros principais navegadores há muito tempo.
Na maioria dos casos, é o mesmo que parentNode
. A única diferença ocorre quando o nó parentNode
não é um elemento. Se sim, parentElement
é null
.
Como um exemplo:
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
Desde que o <html>
elemento ( document.documentElement
) não tem um pai que é um elemento, parentElement
é null
. (Existem outros casos, mais improváveis, onde parentElement
poderia estar null
, mas você provavelmente nunca os encontrará.)
parentElement
era uma coisa proprietária do IE; Acredito que outros navegadores da época (por exemplo, Netscape) sejam compatíveis, parentNode
mas não parentElement
. (Obviamente, uma vez que eu mencionei Netscape, eu estou falando de caminho de volta para IE5 e anteriores ...)
documentfragment.firstChild.parentElement === null
circle
interno a g
), no IE, parentElement
será indefinido e parentNode
será o que você está procurando. :(
No Internet Explorer, parentElement
é indefinido para elementos SVG, enquanto parentNode
está definido.
parentElement
não está sendo implementado para Node
é bem conhecido ( developer.mozilla.org/en-US/docs/Web/API/Node/… ), mas para SVGElement
? Também não pude reproduzir isso document.createElement('svg').parentElement
no IE 11.737.17763.0. Talvez isso tenha sido corrigido enquanto isso?
Use .parentElement
e você não pode dar errado desde que não esteja usando fragmentos de documento.
Se você usar fragmentos de documento, precisará .parentNode
:
let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment
Além disso:
let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>
Aparentemente, o <html>
's .parentNode
links para o documento . Isso deve ser considerado um processo de decisão, pois os documentos não são nós, pois os nós são definidos para serem contidos por documentos e os documentos não podem ser contidos por documentos.
Assim como em nextSibling e nextElementSibling , lembre-se de que as propriedades com "elemento" em seu nome sempre retornam Element
ou null
. Propriedades sem podem retornar qualquer outro tipo de nó.
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
Há mais uma diferença, mas apenas no Internet Explorer. Isso ocorre quando você mistura HTML e SVG. se o pai for o 'outro' desses dois, .parentNode fornecerá o pai, enquanto .parentElement fornecerá indefinido.
undefined
não é null
.