วิธีใช้ MutationObserver API สำหรับการเปลี่ยนแปลงโหนด DOM
นี่คือสถานการณ์: Rita นักเขียนนิตยสารกำลังแก้ไขบทความออนไลน์ของเธอ เธอบันทึกการเปลี่ยนแปลงของเธอและเห็นข้อความ “บันทึกการเปลี่ยนแปลงแล้ว!” ทันใดนั้นเธอสังเกตเห็นการพิมพ์ผิดที่เธอพลาด เธอแก้ไขได้และกำลังจะคลิก “ประหยัด”, เมื่อเธอได้รับโทรศัพท์จากหัวหน้าของเธอ.
หลังจากการโทรสิ้นสุดลงเธอหันกลับไปที่หน้าจอเห็น “บันทึกการเปลี่ยนแปลงแล้ว!” ปิดเครื่องคอมพิวเตอร์และพายุนอกสำนักงาน.
นอกเหนือจากความไม่เหมาะสมของฉันสำหรับการเล่าเรื่องเรายังสังเกตเห็นจากสถานการณ์สั้น ๆ ว่ามีปัญหาอะไรที่ข้อความถาวรก่อเกิดขึ้น ดังนั้นในอนาคตเราตัดสินใจที่จะหลีกเลี่ยงเมื่อเป็นไปได้และใช้สิ่งที่แจ้งให้ผู้ใช้รับทราบด้วยการคลิก - หรือ หายตัวไปเอง. การใช้ข้อความที่สองเพื่อส่งข้อความด่วนเป็นความคิดที่ดี.
เรารู้แล้วว่าจะทำให้องค์ประกอบหายไปจากหน้าเว็บได้อย่างไรจึงไม่เป็นปัญหา สิ่งที่เราต้องรู้คือ มันปรากฏขึ้นเมื่อใด? ดังนั้นเราสามารถทำให้มันหายไปหลังจากเวลาที่เหมาะสม.
MutationObserver API
โดยรวมเมื่อองค์ประกอบ DOM (เช่นข้อความ div
) หรือการเปลี่ยนแปลงโหนดอื่น ๆ เราควรจะสามารถรู้ได้ เป็นเวลานานที่นักพัฒนาต้องพึ่งพาแฮ็กและเฟรมเวิร์กเนื่องจากไม่มี API ดั้งเดิม แต่นั่นก็เปลี่ยนไป.
ตอนนี้เรามี MutationObserver (เหตุการณ์การกลายพันธุ์ก่อนหน้านี้). MutationObserver
เป็นวัตถุพื้นเมืองของ JavaScript ที่มีชุดคุณสมบัติและวิธีการ มันช่วยให้เรา สังเกตการเปลี่ยนแปลงบนโหนดใด ๆ เช่นองค์ประกอบ DOM, เอกสาร, ข้อความ ฯลฯ โดยการกลายพันธุ์เราหมายถึง การเพิ่มหรือลบโหนดและเปลี่ยนเป็นแอตทริบิวต์ & data ของโหนด.
มาดูตัวอย่างเพื่อความเข้าใจที่ดีขึ้น ก่อนอื่นเราจะสร้างที่ซึ่งข้อความจะปรากฏเมื่อคลิกปุ่มเช่นเดียวกับที่ริต้าเห็น จากนั้นเราจะ สร้างและเชื่อมโยงผู้สังเกตการกลายพันธุ์กับกล่องข้อความนั้น และ รหัสตรรกะเพื่อซ่อนข้อความโดยอัตโนมัติ. เข้าใจ?
บันทึก: ในบางครั้งคุณอาจถามฉันในหัวแล้ว “เหตุใดจึงไม่เพียงซ่อนข้อความจากภายในเหตุการณ์คลิกที่ปุ่มเองใน JavaScript?” ในตัวอย่างของฉันฉันไม่ได้ทำงานกับเซิร์ฟเวอร์ดังนั้นแน่นอนว่าลูกค้าต้องรับผิดชอบในการแสดงข้อความและสามารถซ่อนได้ง่ายเกินไป แต่เหมือนในเครื่องมือแก้ไขของ Rita หากเซิร์ฟเวอร์เป็นเซิร์ฟเวอร์ที่ตัดสินใจเปลี่ยนเนื้อหา DOM ลูกค้าจะสามารถตื่นตัวและรอได้.
อันดับแรกเราสร้างการตั้งค่าเพื่อแสดงข้อความเมื่อคลิกปุ่ม.
var msg = document.querySelector ('# msg'), SUCCESSMSG = "การเปลี่ยนแปลงที่บันทึกไว้!"; / * เพิ่มปุ่มคลิกเหตุการณ์ * / document .querySelector ('ปุ่ม') .addEventListener ('คลิก', showMsg); ฟังก์ชั่น showMsg () msg.textContent = SUCCESSMSG; msg.style.background = 'teal';
เมื่อเราทำการตั้งค่าเริ่มต้นแล้วให้ทำสิ่งต่อไปนี้
- สร้าง
MutationObserver
วัตถุที่มีฟังก์ชั่นการโทรกลับที่ผู้ใช้กำหนด (ฟังก์ชั่นจะถูกกำหนดในภายหลังในโพสต์) ฟังก์ชั่นจะดำเนินการในทุกการกลายพันธุ์ที่สังเกตโดยMutationObserver
. - สร้างวัตถุปรับแต่งเพื่อระบุประเภทของการกลายพันธุ์ที่จะต้องปฏิบัติตาม
MutationObserver
. - ผูก
MutationObserver
ไปยังเป้าหมายซึ่งเป็น 'msg'div
ในตัวอย่างของเรา.
(ฟังก์ชั่น startObservation () var / * 1) สร้างวัตถุ MutationObserver * / observer = ใหม่ MutationObserver (ฟังก์ชัน (การกลายพันธุ์) mutationObserverCallback (การกลายพันธุ์);) / * 2) สร้างวัตถุ config * / config = childList: จริง; / * 3) Glue'em all * / observer.observe (msg, config); ) ();
ด้านล่างเป็นรายการคุณสมบัติสำหรับ การตั้งค่า
วัตถุที่ระบุการกลายพันธุ์ชนิดต่าง ๆ เนื่องจากในตัวอย่างของเราเราจัดการกับโหนดข้อความลูกที่สร้างขึ้นสำหรับข้อความเท่านั้นเราจึงใช้ childList
คุณสมบัติ.
ชนิดของการกลายพันธุ์ที่สังเกตได้
คุณสมบัติ | เมื่อตั้งค่าเป็น จริง |
childList | การสอดแทรกและการลบโหนดย่อยของเป้าหมายถูกตรวจพบ. |
แอตทริบิวต์ | สังเกตการเปลี่ยนแปลงคุณสมบัติของเป้าหมาย. |
characterData | สังเกตการเปลี่ยนแปลงข้อมูลของเป้าหมาย. |
ตอนนี้ฟังก์ชั่นการโทรกลับนั้นได้รับการดำเนินการในทุกการกลายพันธุ์ที่สังเกต.
ฟังก์ชั่น mutationObserverCallback (การกลายพันธุ์) / * คว้าการกลายพันธุ์ครั้งแรก * / var mutationRecord = การกลายพันธุ์ [0]; / * ถ้ามีเพิ่มโหนดชายด์ซ่อน msg หลังจาก 2s * / if (mutationRecord.addedNodes [0]! == undefined) setTimeout (hideMsg, 2000); function hideMsg () msg.textContent = "; msg.style.background = 'none';
เนื่องจากเราเพิ่มข้อความไปยัง div
, เราจะคว้าการกลายพันธุ์ครั้งแรกที่พบบนมันและตรวจสอบว่ามีการใส่โหนดข้อความหรือไม่ หากเราเกิดการเปลี่ยนแปลงมากกว่าหนึ่งครั้งเราก็สามารถวนรอบ การกลายพันธุ์
แถว.
การกลายพันธุ์ทุกครั้งใน การกลายพันธุ์
อาร์เรย์จะถูกแทนด้วยวัตถุ MutationRecord
ด้วยคุณสมบัติดังต่อไปนี้.
คุณสมบัติของ MutationRecord
คุณสมบัติ | ผลตอบแทน |
addedNodes | เพิ่มอาร์เรย์ว่างหรืออาร์เรย์ของโหนด. |
attributeName | ค่าว่างหรือชื่อของแอตทริบิวต์ที่ถูกเพิ่มเอาออกหรือเปลี่ยนแปลง. |
attributeNamespace | ค่า Null หรือเนมสเปซของแอตทริบิวต์ที่ถูกเพิ่มเอาออกหรือเปลี่ยนแปลง. |
nextSibling | Null หรือ sibling ถัดไปของโหนดที่ถูกเพิ่มหรือลบ. |
OLDVALUE | ค่า Null หรือก่อนหน้าของแอตทริบิวต์หรือข้อมูลเปลี่ยนไป. |
previousSibling | ค่า Null หรือ sibling ก่อนหน้าของโหนดที่ถูกเพิ่มหรือลบออก. |
removedNodes | อาเรย์ว่างหรืออาเรย์ของโหนดที่ลบออก. |
เป้า | โหนดกำหนดเป้าหมายโดย MutationObserver |
ชนิด | ประเภทของการกลายพันธุ์ที่สังเกต. |
และ…แค่นั้นแหละ เราแค่ต้องใส่รหัสเข้าด้วยกันสำหรับขั้นตอนสุดท้าย.
รองรับเบราว์เซอร์
การอ้างอิง
- “W3C DOM4 สังเกตการณ์การกลายพันธุ์.” W3C เว็บ. 19 มิถุนายน 2558
- “MutationObserver.” Mozilla Developer Network เว็บ. 19 มิถุนายน 2558.