Ai đó có thể giải thích cho tôi bằng những thuật ngữ đơn giản nhất có thể không, sự khác biệt giữa cha mẹ DOM cổ điển và mới được giới thiệu trong Firefox 9 ParentEuity
Ai đó có thể giải thích cho tôi bằng những thuật ngữ đơn giản nhất có thể không, sự khác biệt giữa cha mẹ DOM cổ điển và mới được giới thiệu trong Firefox 9 ParentEuity
Câu trả lời:
parentElement
là mới đối với Firefox 9 và DOM4, nhưng nó đã có mặt trong tất cả các trình duyệt chính khác từ lâu.
Trong hầu hết các trường hợp, nó giống như parentNode
. Sự khác biệt duy nhất đến khi một nút parentNode
không phải là một phần tử. Nếu vậy, parentElement
là null
.
Ví dụ:
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
Vì <html>
phần tử ( document.documentElement
) không có cha mẹ là một phần tử, parentElement
là null
. (Có những trường hợp khác, khó xảy ra hơn, parentElement
có thể xảy ra null
, nhưng có lẽ bạn sẽ không bao giờ bắt gặp chúng.)
parentElement
là một thứ IE độc quyền; Tôi tin rằng các trình duyệt khác tại thời điểm đó (ví dụ: Netscape) được hỗ trợ parentNode
nhưng không parentElement
. (Rõ ràng, với điều kiện tôi đã đề cập đến Netscape, tôi đang nói về cách trở lại IE5 và trước đó ...)
documentfragment.firstChild.parentElement === null
circle
bên trong a g
), trong IE, parentElement
sẽ không được xác định và parentNode
sẽ là thứ bạn đang tìm kiếm. :(
Trong Internet Explorer, parentElement
không được xác định cho các phần tử SVG, trong khi parentNode
được xác định.
parentElement
không được triển khai cho Node
là biết rõ ( developer.mozilla.org/en-US/docs/Web/API/Node/ mẹo ) nhưng vì SVGElement
? Tôi cũng không thể sao chép điều này với document.createElement('svg').parentElement
IE 11.737.17763.0. Điều này có thể được cố định trong thời gian đó?
Sử dụng .parentElement
và bạn không thể sai miễn là bạn không sử dụng các đoạn tài liệu.
Nếu bạn sử dụng các đoạn tài liệu, thì bạn cần .parentNode
:
let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment
Cũng thế:
let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>
Rõ ràng <html>
's .parentNode
liên kết đến các tài liệu . Điều này nên được coi là một phail quyết định vì tài liệu không phải là nút vì các nút được xác định là có thể chứa được bởi các tài liệu và tài liệu không thể được chứa trong tài liệu.
Cũng giống như với nextSibling và nextEuitySibling , chỉ cần nhớ rằng, các thuộc tính có "phần tử" trong tên của chúng luôn trả về Element
hoặc null
. Thuộc tính mà không thể trả về bất kỳ loại nút nào khác.
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
có một sự khác biệt nữa, nhưng chỉ trong thám hiểm internet. Nó xảy ra khi bạn trộn HTML và SVG. nếu cha mẹ là 'cái khác' của hai cái đó, thì .parentNode cung cấp cho cha mẹ, trong khi .parentEuity không xác định.
undefined
không phải là null
.