คลาสที่ใช้ในการจัดการ DOM/จัดการเหตุการณ์ใน TypeScript
ในบทความนี้ เราจะอธิบายคลาสที่ใช้ในการจัดการ DOM/จัดการเหตุการณ์ใน TypeScript
คุณสามารถเรียนรู้เกี่ยวกับคลาส Document
, คลาส Element
และ NodeList
รวมถึงคลาสที่เกี่ยวข้องกับเหตุการณ์ต่าง ๆ ผ่านตัวอย่างโค้ด
YouTube Video
คลาสที่ใช้ในการจัดการ DOM/จัดการเหตุการณ์ใน TypeScript
ในการจัดการ DOM และการจัดการเหตุการณ์ใน TypeScript จะใช้ส่วนต่อประสานของ Document Object Model
(DOM) เป็นหลัก ในการจัดการ DOM และการจัดการเหตุการณ์ จะใช้คลาสและส่วนต่อประสาน JavaScript มาตรฐาน แต่ใน TypeScript จะมีการเพิ่มข้อมูลประเภทเข้ามา ทำให้การทำงานปลอดภัยยิ่งขึ้น
ด้านล่างนี้เป็นการอธิบายคลาสและส่วนต่อประสานที่ใช้บ่อยในการจัดการ DOM และการจัดการเหตุการณ์
คลาส/ส่วนต่อประสานหลักที่ใช้ในการจัดการ DOM
Document
Document
เป็นอ็อบเจกต์ที่แทนเอกสาร HTML หรือ XML ใช้สำหรับเข้าถึงต้นไม้ DOM หรือตามหาองค์ประกอบ
ตัวอย่างโค้ด
1// Get the element using getElementById
2const element = document.getElementById('myElement') as HTMLDivElement | null;
3if (element) {
4 element.textContent = 'Hello, TypeScript!';
5}
6
7// querySelector can specify a generic type for more precise typing
8const button = document.querySelector<HTMLButtonElement>('#myButton');
9button?.addEventListener('click', () => {
10 console.log('Button clicked!');
11
12 // Create a new element dynamically
13 const newDiv = document.createElement('div');
14 newDiv.textContent = 'New element created!';
15 document.body.appendChild(newDiv);
16});
วิธีการหลัก
getElementById
ใช้ดึงองค์ประกอบที่มีแอตทริบิวต์id
ที่ระบุไว้querySelector
ใช้ดึงองค์ประกอบโดยใช้ตัวเลือก CSScreateElement
ใช้สร้างองค์ประกอบ HTML ใหม่
คำอธิบายโค้ด
- โค้ดนี้ดึงองค์ประกอบที่มีแอตทริบิวต์
id
ด้วยgetElementById
และเปลี่ยนข้อความของมัน นอกจากนี้ยังดึงปุ่มด้วยquerySelector
และเพิ่มตัวดักฟังเหตุการณ์คลิก เมื่อมีการคลิก จะสร้างองค์ประกอบdiv
ใหม่ด้วยcreateElement
และเพิ่มเข้าไปในเนื้อหาหลัก มีการใช้ Generics และ type assertion เพื่อความปลอดภัยของชนิดข้อมูลระหว่างดำเนินการกับ DOM
Element
Element
เป็นส่วนต่อประสานที่แทนองค์ประกอบ HTML เดี่ยวๆ ใน DOM มักใช้บ่อยที่สุดเมื่อมีการจัดการ DOM
ตัวอย่างโค้ด
1// Use querySelector to manipulate element properties
2const divElement = document.querySelector<HTMLDivElement>('.myClass');
3if (divElement) {
4 // Set innerHTML
5 divElement.innerHTML = '<strong>Hello with innerHTML!</strong>';
6
7 // Set textContent
8 divElement.textContent = 'Hello with textContent!';
9
10 // Add a new class
11 divElement.classList.add('newClass');
12
13 // Set a custom attribute
14 divElement.setAttribute('data-role', 'content');
15}
คุณสมบัติและเมธอดหลัก
- คุณสมบัติ
innerHTML
ช่วยให้สามารถกำหนดหรือรับเนื้อหา HTML ขององค์ประกอบได้ - คุณสมบัติ
textContent
ช่วยให้สามารถกำหนดหรือรับเนื้อหาข้อความขององค์ประกอบได้ classList
เป็นพร็อพเพอร์ตี้สำหรับจัดการคลาส ช่วยให้คุณสามารถเพิ่ม ลบ หรือสลับคลาสได้- เมธอด
setAttribute
ใช้กำหนดแอตทริบิวต์ในองค์ประกอบ
คำอธิบายโค้ด
- โค้ดนี้แสดงตัวอย่างการตั้งค่าคอนเทนต์ด้วย
innerHTML
และtextContent
สำหรับองค์ประกอบที่ดึงมาด้วยquerySelector
การเพิ่มคลาสด้วยclassList
และการตั้งค่าแอตทริบิวต์ที่กำหนดเองด้วยsetAttribute
การทำงานต่าง ๆ ถูกดำเนินการอย่างปลอดภัยของชนิดข้อมูลด้วยการใช้ generics
NodeList
และ HTMLCollection
NodeList
และ HTMLCollection
เป็นคอลเลกชันที่บรรจุองค์ประกอบ DOM หลายๆ ตัว ตัวอย่างเช่น querySelectorAll
จะคืนค่าเป็น NodeList
และ getElementsByClassName
จะคืนค่าเป็น HTMLCollection
ตัวอย่างโค้ด
1// NodeList supports forEach iteration
2const divs: NodeListOf<HTMLDivElement> = document.querySelectorAll('div');
3divs.forEach(div => {
4 div.textContent = 'Updated!';
5});
6
7// HTMLCollection is not directly iterable, convert it to an array
8const spans: HTMLCollectionOf<HTMLSpanElement> =
9 document.getElementsByClassName('span-item') as HTMLCollectionOf<HTMLSpanElement>;
10Array.from(spans).forEach(span => {
11 span.textContent = 'Changed!';
12});
- โค้ดนี้แสดงตัวอย่างการจัดการ
NodeList
โดยตรงด้วยforEach
และแปลงHTMLCollection
เป็นอาร์เรย์เพื่อวนซ้ำ
คลาส/ส่วนต่อประสานหลักที่ใช้ในการจัดการเหตุการณ์
Event
Event
เป็นคลาสพื้นฐานสำหรับเหตุการณ์ทั้งหมดที่เกิดขึ้นใน DOM เหตุการณ์ต่างๆ เช่น การคลิก การป้อนข้อมูล และการโหลดหน้าเว็บ สืบทอดจากคลาส Event
ตัวอย่างโค้ด
1const form = document.querySelector<HTMLFormElement>('#myForm');
2form?.addEventListener('submit', (event: Event) => {
3 // target refers to the element that triggered the event (the form)
4 const target = event.target as HTMLFormElement;
5
6 // type shows the kind of event, e.g., "submit"
7 console.log(`Event type: ${event.type}`);
8
9 // preventDefault disables the default form submission
10 event.preventDefault();
11 console.log('Form submission prevented.');
12});
คุณสมบัติและเมธอดหลัก
- คุณสมบัติ
target
หมายถึงองค์ประกอบ (EventTarget
) ที่เกิดเหตุการณ์ขึ้น type
หมายถึงประเภทของเหตุการณ์ที่เกิดขึ้น เช่นclick
หรือinput
- เมธอด
preventDefault
ยกเลิกการทำงานเริ่มต้นของเหตุการณ์
คำอธิบายโค้ด
- โค้ดนี้แสดงวิธีเพิ่มตัวดักฟังเหตุการณ์
submit
ให้กับฟอร์มtarget
หมายถึงฟอร์มที่เกิดเหตุการณ์นั้นขึ้น ส่วนtype
คือชนิดของเหตุการณ์ (ในกรณีนี้คือ"submit"
) โดยการเรียกใช้เมธอดpreventDefault
คุณสามารถปิดการทำงานปกติของแบบฟอร์ม เช่น การย้ายหน้า หรือรีโหลดหน้า แทนที่จะเป็นเช่นนั้น จะมีการดำเนินการเฉพาะที่กำหนดเอง เช่น การบันทึกข้อมูลออกแสดงผลที่นี่
MouseEvent
MouseEvent
แทนเหตุการณ์ที่เกี่ยวข้องกับการใช้งานเมาส์ เหตุการณ์เมาส์ เช่น click
และ mousemove
ใช้คลาสนี้
ตัวอย่างโค้ด
1const div = document.getElementById('clickArea');
2if (div) {
3 div.addEventListener('click', (event: MouseEvent) => {
4 console.log(`Clicked at: (${event.clientX}, ${event.clientY})`);
5 });
6}
- โค้ดนี้เป็นตัวอย่างการใช้
MouseEvent
เพื่อแสดงพิกัดของเมาส์
คุณสมบัติหลัก
clientX
คือพิกัดแกน X ของตำแหน่งเมาส์ภายในหน้าclientY
คือพิกัดแกน Y ของตำแหน่งเมาส์ภายในหน้าbutton
แสดงว่าปุ่มเมาส์ปุ่มใดถูกกด0
คือปุ่มซ้าย,1
คือปุ่มกลาง, และ2
คือปุ่มขวา
KeyboardEvent
KeyboardEvent
แทนเหตุการณ์ที่เกี่ยวข้องกับการใช้งานคีย์บอร์ด เหตุการณ์ keydown
และ keyup
อยู่ในประเภทนี้
ตัวอย่างโค้ด
1document.addEventListener('keydown', (event: KeyboardEvent) => {
2 // Show the key name (e.g., "Enter", "a")
3 console.log(`Key pressed: ${event.key}`);
4
5 // Show the physical key code (e.g., "Enter", "KeyA")
6 console.log(`Key code: ${event.code}`);
7
8 // Check if Alt/Ctrl/Shift key was pressed
9 console.log(`Alt pressed: ${event.altKey}`);
10 console.log(`Ctrl pressed: ${event.ctrlKey}`);
11 console.log(`Shift pressed: ${event.shiftKey}`);
12
13 if (event.key === 'Enter') {
14 console.log('Enter was pressed');
15 }
16});
คุณสมบัติหลัก
key
คือชื่อของปุ่มที่ถูกกด เช่นEnter
หรือa
code
คือรหัสที่สอดคล้องกับปุ่มบนแป้นพิมพ์altKey
,ctrlKey
และshiftKey
เป็นคุณสมบัติที่บ่งชี้ว่าปุ่มAlt
,Ctrl
หรือShift
ถูกกดหรือไม่
คำอธิบายโค้ด
- โค้ดนี้ใช้
KeyboardEvent
เพื่อล็อกชื่อของปุ่มที่ถูกกด (key
), โค้ดของปุ่ม (code
) และตรวจสอบว่ามีการกดปุ่มเสริม (altKey
,ctrlKey
,shiftKey
) ด้วยหรือไม่ นอกจากนี้ยังทำงานพิเศษเมื่อกดปุ่มEnter
FocusEvent
FocusEvent
เกี่ยวข้องกับเหตุการณ์ของการได้หรือสูญเสียโฟกัส เหตุการณ์ focus
และ blur
อยู่ในประเภทนี้
ตัวอย่างโค้ด
1const inputElement = document.getElementById('myInput');
2if (inputElement) {
3 inputElement.addEventListener('focus', (event: FocusEvent) => {
4 console.log('Input focused');
5 });
6
7 inputElement.addEventListener('blur', (event: FocusEvent) => {
8 console.log('Input lost focus');
9 });
10}
- โค้ดนี้เป็นตัวอย่างการใช้
FocusEvent
เพื่อตรวจสอบและบันทึกเมื่อ input field ได้รับหรือสูญเสียโฟกัส
การกำหนดประเภทใน TypeScript
เมื่อใช้ TypeScript การตรวจสอบประเภทในการจัดการ DOM และการจัดการเหตุการณ์จะมีความแม่นยำยิ่งขึ้น ตัวอย่างด้านล่างแสดงการจัดการ DOM และการจัดการเหตุการณ์ที่ปลอดภัยใน TypeScript
การใช้ Event Listener ที่กำหนดประเภท
เมื่อเพิ่ม event listener การกำหนดประเภทของเหตุการณ์ช่วยให้ระบบตรวจสอบประเภทและป้องกันการเข้าถึงคุณสมบัติที่ไม่ถูกต้อง
1const input = document.querySelector<HTMLInputElement>('#myInput');
2// Event listener with explicit type annotation for safety
3input?.addEventListener('input', (event: Event) => {
4 // event.target is EventTarget, so it needs to be cast to the correct type
5 const target = event.target as HTMLInputElement;
6 console.log(`Current value: ${target.value}`);
7});
- โค้ดนี้เป็นตัวอย่างการใช้ event listener ที่ระบุชนิดเพื่อจัดการเหตุการณ์ input และดึงรวมถึงบันทึกค่าปัจจุบันของ input field อย่างปลอดภัย
การจัดการเหตุการณ์โดยใช้แบบทั่วไป
การใช้ generics ใน TypeScript ช่วยให้คุณสามารถจัดการเหตุการณ์แบบทั่วไปที่รองรับประเภทเหตุการณ์ต่างๆ ได้
1// Generic event handler function
2function handleEvent<T extends Event>(event: T) {
3 console.log(`Event type: ${event.type}`);
4 if (event.target instanceof HTMLElement) {
5 console.log(`Target element: ${event.target.tagName}`);
6 }
7}
8
9const input = document.querySelector<HTMLInputElement>('#myInput');
10input?.addEventListener('input', handleEvent);
- โค้ดนี้เป็นตัวอย่างของ event handler ทั่วไปโดยใช้ generics เพื่อบันทึกประเภทเหตุการณ์และชื่อแท็กขององค์ประกอบเป้าหมาย
สรุป
ใน TypeScript, ประเภทต่างๆ ถูกใช้งานใน API มาตรฐานของ DOM ระหว่างการจัดการ DOM และการจัดการเหตุการณ์ เพื่อเพิ่มความปลอดภัยและความเข้าใจในโค้ด ด้วยการใช้คลาสต่างๆ เช่น Document
และ Element
รวมถึงคลาสที่เกี่ยวข้องกับเหตุการณ์ เช่น Event
, MouseEvent
และ KeyboardEvent
สามารถพัฒนาโค้ดที่ปลอดภัยในแง่ของประเภทข้อมูลได้ นอกจากนี้ การใช้ querySelector<T>()
หรือ HTMLCollectionOf<T>
ยังช่วยให้สามารถจัดการ DOM ได้อย่างปลอดภัยตามชนิดข้อมูล
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย