Adakah yang bisa menjelaskan saya sesederhana mungkin, apa perbedaan antara DOM parentNode klasik dan yang baru diperkenalkan di Firefox 9 parentElement
Adakah yang bisa menjelaskan saya sesederhana mungkin, apa perbedaan antara DOM parentNode klasik dan yang baru diperkenalkan di Firefox 9 parentElement
Jawaban:
parentElement
adalah baru untuk Firefox 9 dan DOM4, tetapi telah ada di semua browser utama lainnya sejak lama.
Dalam kebanyakan kasus, ini sama dengan parentNode
. Satu-satunya perbedaan terjadi ketika simpul parentNode
bukan elemen. Jika demikian, parentElement
adalah null
.
Sebagai contoh:
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
Karena <html>
elemen ( document.documentElement
) tidak memiliki orangtua yang merupakan elemen, parentElement
adalah null
. (Ada beberapa kasus lain yang lebih tidak parentElement
mungkin terjadi null
, tetapi Anda mungkin tidak akan pernah menemukannya.)
parentElement
adalah hal yang merupakan hak milik IE; Saya percaya browser lain pada saat itu (misalnya, Netscape) mendukung parentNode
tetapi tidak parentElement
. (Jelas, mengingat saya telah menyebutkan Netscape, saya sedang berbicara tentang jalan kembali ke IE5 dan sebelumnya ...)
documentfragment.firstChild.parentElement === null
circle
di dalam a g
), di IE, parentElement
akan tidak terdefinisi, dan parentNode
akan menjadi apa yang Anda cari. :(
Di Internet Explorer, parentElement
tidak ditentukan untuk elemen SVG, sedangkan parentNode
didefinisikan.
parentElement
tidak diterapkan untuk Node
diketahui ( developer.mozilla.org/en-US/docs/Web/API/Node/… ) tetapi untuk SVGElement
? Saya juga tidak bisa mereproduksi ini dengan document.createElement('svg').parentElement
IE 11.737.17763.0. Apakah ini mungkin sudah diperbaiki sementara itu?
Gunakan .parentElement
dan Anda tidak bisa salah asalkan Anda tidak menggunakan fragmen dokumen.
Jika Anda menggunakan fragmen dokumen, maka Anda perlu .parentNode
:
let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment
Juga:
let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>
Ternyata <html>
itu .parentNode
tautan ke Dokumen . Ini harus dianggap sebagai keputusan keputusan karena dokumen bukan node karena node didefinisikan dapat disimpan oleh dokumen dan dokumen tidak dapat dimuat oleh dokumen.
Sama seperti dengan nextSibling dan nextElementSibling , ingatlah bahwa, properti dengan "elemen" dalam namanya selalu kembali Element
atau null
. Properti tanpa dapat mengembalikan jenis simpul lainnya.
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
ada satu lagi perbedaan, tetapi hanya di internet explorer. Itu terjadi ketika Anda mencampur HTML dan SVG. jika orangtua adalah 'yang lain' dari keduanya, maka .parentNode memberikan induk, sementara .parentElement memberikan yang tidak terdefinisi.
undefined
tidak null
.