DOM parentNode 和 parentElement 的区别

IT技术 javascript firefox dom
2021-01-18 16:48:10

有人可以简单解释一下,经典的DOM parentNode和Firefox 9 parentElement 中新引入的有什么区别

5个回答

parentElement 是 Firefox 9 和 DOM4 的新特性,但它已经存在于所有其他主要浏览器中多年。

在大多数情况下,它与parentNode. 唯一的区别是当节点parentNode不是元素时。如果是,parentElementnull

举个例子:

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) 没有作为元素的父元素,因此parentElementnull(还有其他更不可能的情况parentElement可能是null,但您可能永远不会遇到它们。)

@Raynos 这实际上是我在回答的最后一句话中想到的确切情况......
2021-03-17 16:48:10
原来parentElement是一个专有的 IE 东西;我相信当时的其他浏览器(例如 Netscape)支持parentNode但不支持parentElement. (显然,鉴于我已经提到了 Netscape,我指的是回到 IE5 和更早版本的方式......)
2021-03-24 16:48:10
正如我刚刚发现的那样,在 IE 中的 SVG 元素(如 a circleinside g)上,parentElement将是未定义的,并且parentNode将是您要查找的内容。:(
2021-03-24 16:48:10
换句话说,它在 99.999999999999% 的情况下完全没有意义。是谁的主意?
2021-03-29 16:48:10
@lonesomeday 你忘记了 documentfragment.firstChild.parentElement === null
2021-03-30 16:48:10

在 Internet Explorer 中,parentElement对于 SVG 元素未定义,而已parentNode定义。

我找不到来源。众所周知(developer.mozilla.org/en-US/docs/Web/API/Node/...parentElement没有被实现,但是对于我也无法在 IE 11.737.17763.0 中重现这一点。这可能是在此期间修复的吗?NodeSVGElementdocument.createElement('svg').parentElement
2021-03-19 16:48:10
@speedplane 很高兴这是一个答案,因为这没有逻辑意义,让我难倒了好一阵子......
2021-03-21 16:48:10
老实说,我认为这更多的是评论而不是答案。
2021-03-23 16:48:10
对于评论节点,它也未定义。在 Chrome 中,我很高兴获得评论的父级,但在 IE 中未定义。
2021-03-23 16:48:10
可能吧,但这就是我把头撞在桌子上一个小时或更长时间直到我弄明白的原因。我怀疑许多其他人在类似的头撞之后来到这个页面。
2021-04-09 16:48:10

使用.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”的属性总是返回Elementor 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
是的,但与 nextsibling 文本或注释节点不同,不能是父节点。
2021-04-04 16:48:10

还有一个区别,但仅限于 Internet Explorer。当您混合 HTML 和 SVG 时会发生这种情况。如果父节点是这两者中的“另一个”,则 .parentNode 给出父节点,而 .parentElement 给出未定义。

我认为undefined不是null
2021-04-01 16:48:10