ฉันพบว่าตัวเองใช้ JavaScript และฉันวิ่งข้ามchildNodes
และchildren
คุณสมบัติ ฉันสงสัยว่าความแตกต่างระหว่างพวกเขาคืออะไร อีกคนหนึ่งชอบกันหรือไม่?
ฉันพบว่าตัวเองใช้ JavaScript และฉันวิ่งข้ามchildNodes
และchildren
คุณสมบัติ ฉันสงสัยว่าความแตกต่างระหว่างพวกเขาคืออะไร อีกคนหนึ่งชอบกันหรือไม่?
คำตอบ:
เข้าใจว่า.children
เป็นทรัพย์สินของต์ธาตุ 1มีองค์ประกอบเท่านั้น.children
และลูกเหล่านี้เป็นองค์ประกอบประเภททั้งหมด 2
แต่.childNodes
เป็นทรัพย์สินของโหนด .childNodes
สามารถมีโหนดใด ๆ 3
ตัวอย่างที่เป็นรูปธรรมคือ:
let el = document.createElement("div");
el.textContent = "foo";
el.childNodes.length === 1; // Contains a Text node child.
el.children.length === 0; // No Element children.
ส่วนใหญ่คุณต้องการใช้.children
เพราะโดยทั่วไปแล้วคุณไม่ต้องการวนซ้ำโหนดข้อความหรือข้อคิดเห็นในการจัดการ DOM ของคุณ
หากคุณต้องการจัดการกับโหนดข้อความคุณอาจต้องการ.textContent
แทน 4
1. ในทางเทคนิคมันเป็นคุณสมบัติของParentNodeซึ่งเป็นมิกซ์อินที่รวมอยู่ในองค์ประกอบ
2. เป็นองค์ประกอบทั้งหมดเพราะ.children
เป็นHTMLCollectionซึ่งสามารถมีองค์ประกอบได้เท่านั้น
3. ในทำนองเดียวกัน.childNodes
สามารถถือโหนดใด ๆ เพราะมันเป็นNodeList
4. .innerText
หรือ เห็นความแตกต่างที่นี่หรือที่นี่
.children
เอกสาร XML : jsfiddle.net/fbwbjvch/1
Element.children
ส่งคืนอิลิเมนต์ลูกเท่านั้นในขณะที่Node.childNodes
ส่งคืนโหนดลูกทั้งหมด โปรดทราบว่าองค์ประกอบนั้นเป็นโหนดดังนั้นทั้งคู่จึงมีอยู่ในองค์ประกอบ
ฉันเชื่อว่าchildNodes
น่าเชื่อถือมากขึ้น ตัวอย่างเช่น MDC (เชื่อมโยงด้านบน) ตั้งข้อสังเกตว่า IE มีchildren
สิทธิ์ใน IE 9 เท่านั้น childNodes
ให้พื้นที่น้อยกว่าสำหรับข้อผิดพลาดโดยผู้ใช้เบราว์เซอร์
.children
ว่าไม่ได้กรองโหนดความคิดเห็น แต่จะกรองโหนดข้อความออก
.getElementsByTagName('*')
เช่นเดียวกันกับ บางครั้ง IE อาจสร้างความรำคาญให้กับตัวเอง ...
children
IE ที่สนับสนุน
คำตอบที่ดีฉันต้องการเพิ่มเฉพาะที่คุณสามารถตรวจสอบประเภทของโหนดโดยใช้nodeType
:
yourElement.nodeType
สิ่งนี้จะทำให้คุณเป็นจำนวนเต็ม: (นำมาจากที่นี่ )
| Value | Constant | Description | |
|-------|----------------------------------|---------------------------------------------------------------|--|
| 1 | Node.ELEMENT_NODE | An Element node such as <p> or <div>. | |
| 2 | Node.ATTRIBUTE_NODE | An Attribute of an Element. The element attributes | |
| | | are no longer implementing the Node interface in | |
| | | DOM4 specification. | |
| 3 | Node.TEXT_NODE | The actual Text of Element or Attr. | |
| 4 | Node.CDATA_SECTION_NODE | A CDATASection. | |
| 5 | Node.ENTITY_REFERENCE_NODE | An XML Entity Reference node. Removed in DOM4 specification. | |
| 6 | Node.ENTITY_NODE | An XML <!ENTITY ...> node. Removed in DOM4 specification. | |
| 7 | Node.PROCESSING_INSTRUCTION_NODE | A ProcessingInstruction of an XML document | |
| | | such as <?xml-stylesheet ... ?> declaration. | |
| 8 | Node.COMMENT_NODE | A Comment node. | |
| 9 | Node.DOCUMENT_NODE | A Document node. | |
| 10 | Node.DOCUMENT_TYPE_NODE | A DocumentType node e.g. <!DOCTYPE html> for HTML5 documents. | |
| 11 | Node.DOCUMENT_FRAGMENT_NODE | A DocumentFragment node. | |
| 12 | Node.NOTATION_NODE | An XML <!NOTATION ...> node. Removed in DOM4 specification. | |
โปรดทราบว่าตามMozilla :
ค่าคงที่ต่อไปนี้ถูกเลิกใช้แล้วและไม่ควรใช้อีกต่อไป: Node.ATTRIBUTE_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
ฉันจะไปกับParentNode.children :
เนื่องจากมันมีnamedItem
วิธีการที่ทำให้ฉันสามารถรับองค์ประกอบของเด็ก ๆ ได้โดยตรงโดยไม่ต้องวนลูปผ่านลูกทั้งหมดหรือหลีกเลี่ยงการใช้getElementById
ฯลฯ
เช่น
ParentNode.children.namedItem('ChildElement-ID'); // JS
ref.current.children.namedItem('ChildElement-ID'); // React
this.$refs.ref.children.namedItem('ChildElement-ID'); // Vue
ฉันจะไปกับNode.childNodes :
มันให้forEach
วิธีการเมื่อฉันทำงานกับwindow.IntersectionObserver
เช่น
nodeList.forEach((node) => { observer.observe(node) })
// IE11 does not support forEach on nodeList, but easy to be polyfilled.
บน Chrome 83
Node.childNodesให้
entries
,forEach
,item
,keys
,length
และvalues
ParentNode.childrenให้
item
,length
และnamedItem