ในหน้าเว็บของเรา นอกเหนือจากการใช้วิธีการที่ DOM จัดเตรียมไว้เพื่อรับโหนดแล้ว เรายังสามารถใช้ความสัมพันธ์แบบลำดับชั้นของโหนดเพื่อรับโหนดได้อีกด้วย เรามาสรุปกันในวันนี้เลย!
เนื้อหาทั้งหมดในเว็บเพจคือโหนด (ป้ายกำกับ คุณลักษณะ ข้อความ ความคิดเห็น ฯลฯ) และใน DOM โหนดจะแสดงด้วยโหนด
โหนดทั้งหมดในแผนผัง HTML DOM สามารถเข้าถึงได้ผ่าน JavaScript และองค์ประกอบ HTML ทั้งหมด (โหนด) สามารถแก้ไข สร้าง หรือลบได้
โดยทั่วไปโหนดจะมีแอตทริบิวต์พื้นฐานอย่างน้อยสามประการ: nodeType (ประเภทโหนด), nodeName (ชื่อโหนด) และ nodeValue (ค่าโหนด)
ในการพัฒนาจริงของเรา การทำงานของโหนดจะทำงานบนโหนดองค์ประกอบเป็นหลัก
ใช้แผนผัง DOM เพื่อแบ่งโหนดออกเป็นความสัมพันธ์แบบลำดับชั้นต่างๆ ความสัมพันธ์ที่พบบ่อยที่สุดคือความสัมพันธ์แบบลำดับชั้นระหว่างพ่อแม่และลูก
node.parentNode
<p class="ผู้ปกครอง"> <p class="ลูกชาย"></p> </p> <สคริปต์> var son = document.querySelector(".son"); console.log(son.parentNode); </สคริปต์>
1.node.childNodes (มาตรฐาน)
node.childNodes ส่งคืนคอลเลกชันที่มีโหนดย่อยของโหนดที่ระบุ คอลเลกชันนี้เป็นคอลเลกชันที่อัปเดตทันที
<ul> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> </ul> <สคริปต์> var ul = document.querySelector('ul'); //โหนดย่อย childNodes โหนดย่อยทั้งหมด รวมถึงโหนดองค์ประกอบ โหนดข้อความ ฯลฯ console.log(ul.childNodes); </สคริปต์>
เหตุใดจึงมีโหนดข้อความห้ารายการที่นี่ จริง ๆ แล้วพวกมันสอดคล้องกับตัวแบ่งบรรทัดห้าบรรทัด
การแบ่งบรรทัดทั้งห้านี้เป็นโหนดข้อความ บวกกับโหนดองค์ประกอบ li สี่โหนด รวมเป็น 9
หมายเหตุ: ค่าที่ส่งคืนประกอบด้วยโหนดย่อยทั้งหมด รวมถึงโหนดองค์ประกอบ โหนดข้อความ ฯลฯ
หากคุณต้องการเพียงให้โหนดองค์ประกอบอยู่ข้างใน คุณจะต้องจัดการมันเป็นพิเศษ ดังนั้นโดยทั่วไปเราไม่สนับสนุนการใช้ childNodes
var ul = document.querySelector('ul'); สำหรับ (var i = 0;i<ul.length;i++){ ถ้า (ul.childNodes[i].nodeType == 1){ console.log(ul.childNodes[i]); - }
2.node.children (ไม่ได้มาตรฐาน)
node.children เป็นคุณสมบัติแบบอ่านอย่างเดียวที่ส่งคืนโหนดองค์ประกอบลูกทั้งหมด มันจะส่งคืนโหนดองค์ประกอบลูกเท่านั้น และโหนดอื่นจะไม่ถูกส่งคืน (นี่คือสิ่งที่เรามุ่งเน้น)
แม้ว่าเด็ก ๆ จะไม่ได้มาตรฐาน แต่ก็มีเบราว์เซอร์ต่าง ๆ รองรับดังนั้นเราจึงสามารถใช้งานได้อย่างมั่นใจ
<ul> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> </ul> <สคริปต์> var ul = document.querySelector('ul'); console.log(ul.children); </สคริปต์>
1.node
2.node.lastChild
firstChild ส่งคืนโหนดลูกแรก หากไม่พบมันจะส่งคืน null เช่นเดียวกับ LastChild ในทำนองเดียวกันจะรวมโหนดทั้งหมดไว้ด้วย
3.node.firstElementChild
firstElementChild ส่งคืนโหนดองค์ประกอบลูกแรก หรือเป็นโมฆะหากไม่พบ
4.node.lastElementChild
LastElementChild ส่งคืนโหนดองค์ประกอบลูกสุดท้าย หรือเป็นโมฆะหากไม่พบ
หมายเหตุ: ทั้งสองวิธีนี้มีปัญหาความเข้ากันได้และรองรับเฉพาะ IE9 ขึ้นไปเท่านั้น
5.node.children[0]
5.node.children[node.children.length - 1]
หมายเหตุ: ไม่มีปัญหาความเข้ากันได้กับวิธีการเขียนเพื่อการพัฒนาจริง
<ul> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> <li>ฉันคือ ลี่</li> </ul> <สคริปต์> var ul = document.querySelector('ul'); // 1. ไม่ว่าจะเป็นโหนดข้อความหรือโหนดองค์ประกอบ console.log(ul.firstChild); console.log(ul.lastChild); // 2. ส่งคืนโหนดองค์ประกอบตนเองที่สอดคล้องกัน เฉพาะ IE9 และสูงกว่าเท่านั้นที่รองรับ console.log(ul.firstElementChild); console.log(ul.lastElementChild); // 3. ไม่มีปัญหาความเข้ากันได้ console.log(ul.children[0]); console.log(ul.children[ul.children.length - 1]); </สคริปต์>
1.โหนดถัดไปพี่น้อง
nextSibling ส่งคืนโหนดพี่น้องถัดไปขององค์ประกอบปัจจุบัน หรือเป็นโมฆะหากไม่พบ ในทำนองเดียวกันจะรวมโหนดทั้งหมดไว้ด้วย
2.node. ก่อนหน้าพี่น้อง
PreviousSibling ส่งคืนโหนดพี่น้องก่อนหน้าขององค์ประกอบปัจจุบัน หรือเป็นโมฆะหากไม่พบ ในทำนองเดียวกันจะรวมโหนดทั้งหมดไว้ด้วย
3.node.nextElementพี่น้อง
nextElementSibling ส่งคืนโหนดองค์ประกอบพี่น้องถัดไปขององค์ประกอบปัจจุบัน หากไม่พบ จะส่งคืน null
4.node. PreviousElementพี่น้อง
PreviousElementSibling ส่งคืนโหนดองค์ประกอบพี่น้องก่อนหน้าขององค์ประกอบปัจจุบัน หรือเป็นโมฆะหากไม่พบ
หมายเหตุ: ทั้งสองวิธีนี้มีปัญหาความเข้ากันได้และรองรับเฉพาะ IE9 ขึ้นไปเท่านั้น
ดังนั้นจะสรุปฟังก์ชันที่ตรงตามความเข้ากันได้และสามารถค้นหาโหนดองค์ประกอบพี่น้องได้อย่างไร
ฟังก์ชัน getNextElementSibling(element){ var el = องค์ประกอบ; ในขณะที่ (el = el.nextSibling){ ถ้า (el.nodeType == 1) { กลับเอล; - - กลับเป็นโมฆะ; }
โค้ดที่ห่อหุ้มข้างต้นสามารถแก้ไขได้ แต่คุณไม่จำเป็นต้องคิดมากเกินไป เนื่องจากเบราว์เซอร์ IE กำลังจะหยุดให้บริการ ดังนั้นคุณเพียงแค่ต้องจำโหนด nextElementSibling และคุณไม่จำเป็นต้องกังวลเกี่ยวกับความเข้ากันได้ ปัญหา.
document.createElement (' tagName ')
วิธีการ document.createElenent () สร้างองค์ประกอบ Н TML ที่ระบุโดย tagName เนื่องจากองค์ประกอบเหล่านี้ไม่มีอยู่แต่เดิมและถูกสร้างขึ้นแบบไดนามิกตามความต้องการของฉัน เราจึงถูกเรียกว่า การสร้างโหนดองค์ประกอบแบบไดนามิก
1.node.appendChild(child)
วิธีการ node.appendChild () เพิ่มโหนดที่ส่วนท้ายของรายการโหนดลูกของโหนดหลักที่ระบุ คล้ายกับองค์ประกอบหลอกหลังใน CSS
2.node.insertBefore(ลูก องค์ประกอบที่ระบุ)
<ul></ul> <สคริปต์> var ul = document.querySelector("ul"); var li =document.createElement("li"); var span = document.createElement("ช่วง") ul.ผนวกเด็ก(li); ul.insertBefore(ช่วง,ul.children[0]); </สคริปต์>
node.removeChild(child)
วิธีการ node.removeChild(child) จะลบโหนดลูกออกจาก DOM และส่งคืนโหนดที่ถูกลบ
<ul> <li>อานิว</li> <li>แต่งงาน</li> <li>ทอม</li> </ul> <สคริปต์> var ul = document.querySelector("ul"); ul.removeChild(ul.เด็ก[2]); </สคริปต์>
node.cloneNode ()
วิธีการ node.cloneNode () ส่งกลับสำเนาของโหนดที่เรียกว่าวิธีนี้ เรียกอีกอย่างว่าโหนดโคลน/โหนดคัดลอก
1. หากพารามิเตอร์วงเล็บว่างเปล่าหรือเป็นเท็จ จะเป็นสำเนาแบบตื้น กล่าวคือ เฉพาะโหนดเท่านั้นที่ถูกโคลน และโหนดย่อยภายในจะไม่ถูกโคลน
2. หากพารามิเตอร์วงเล็บเป็นจริง จะเป็นสำเนาเชิงลึก ซึ่งจะคัดลอกโหนดเองและโหนดย่อยทั้งหมด
<ul> <li>อานิว</li> <li>แต่งงาน</li> <li>ทอม</li> </ul> <สคริปต์> var ul = document.querySelector("ul"); var li1 = ul.children[0].cloneNode(); // คัดลอกแบบตื้น var li2 = ul.children[0].cloneNode(true); // คัดลอกแบบลึก ul.appendChild(li1); ul.ผนวกเด็ก(li2); </สคริปต์>