ใครบางคนในการอธิบายให้ฉันเข้าใจได้ง่ายที่สุดเท่าที่จะเป็นไปได้ความแตกต่างระหว่างparent DOM รุ่นคลาสสิคและรุ่นใหม่ที่แนะนำใน Firefox 9 parentElement คืออะไร
ใครบางคนในการอธิบายให้ฉันเข้าใจได้ง่ายที่สุดเท่าที่จะเป็นไปได้ความแตกต่างระหว่างparent DOM รุ่นคลาสสิคและรุ่นใหม่ที่แนะนำใน Firefox 9 parentElement คืออะไร
คำตอบ:
parentElement
ใหม่สำหรับ Firefox 9 และ DOM4 แต่มีอยู่ในเบราว์เซอร์หลักอื่น ๆ สำหรับทุกวัย
parentNode
ในกรณีส่วนใหญ่ก็เป็นเช่นเดียวกับ ข้อแตกต่างเกิดขึ้นเมื่อโหนดparentNode
ไม่ใช่องค์ประกอบ ถ้าparentElement
เป็นnull
เช่นนั้น
ตัวอย่างเช่น:
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
) ไม่ได้มีผู้ปกครองที่เป็นองค์ประกอบที่เป็นparentElement
null
(มีอีกหลายกรณีไม่น่าเป็นไปparentElement
ได้null
แต่คุณอาจไม่เคยเจอเลย)
parentElement
คือสิ่งที่เป็นกรรมสิทธิ์ของ IE; ผมเชื่อว่าเบราว์เซอร์อื่น ๆ ในเวลานั้น (เช่น Netscape) ได้รับการสนับสนุนแต่ไม่parentNode
parentElement
(เห็นได้ชัดว่าฉันได้พูดถึง Netscape แล้วฉันกำลังพูดถึงวิธีกลับไปที่ IE5 และก่อนหน้านี้ ... )
documentfragment.firstChild.parentElement === null
circle
ภายในg
) ใน IE parentElement
จะไม่ถูกกำหนดและparentNode
จะเป็นสิ่งที่คุณกำลังมองหา :(
ใน Internet Explorer parentElement
ไม่ได้กำหนดไว้สำหรับองค์ประกอบ SVG ในขณะที่parentNode
กำหนดไว้
parentElement
ไม่ได้ถูกนำมาใช้สำหรับNode
เป็นที่รู้จักกันดี ( developer.mozilla.org/en-US/docs/Web/API/Node/... ) แต่สำหรับSVGElement
? ฉันไม่สามารถทำซ้ำสิ่งนี้ด้วยdocument.createElement('svg').parentElement
ใน IE 11.737.17763.0 นี่อาจจะถูกแก้ไขในระหว่างนี้หรือไม่?
ใช้งาน.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>
's .parentNode
เชื่อมโยงไปยังเอกสาร สิ่งนี้ควรถูกพิจารณาว่าเป็น phail การตัดสินใจเนื่องจากเอกสารไม่ใช่โหนดเนื่องจากโหนดถูกกำหนดให้มีเอกสารและเอกสารไม่สามารถมีได้
เช่นเดียวกับnextSibling และ nextElementSiblingเพียงจำไว้ว่าคุณสมบัติที่มี "องค์ประกอบ" ในชื่อจะส่งคืนElement
หรือ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
มีอีกหนึ่งความแตกต่าง แต่เฉพาะใน internet explorer มันเกิดขึ้นเมื่อคุณผสม HTML และ SVG ถ้า parent คือ 'other' ของสองตัวนั้น. parentNode จะให้ parent ในขณะที่. parentElement จะให้ undefined
undefined
null