מחלקות המשמשות לטיפול ב-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
מאחזר אלמנט בעזרת בורר CSS.createElement
יוצר אלמנט HTML חדש.
הסבר קוד
- הקוד הזה מאחזר אלמנט בעל מאפיין
id
באמצעותgetElementById
ומשנה את הטקסט שלו. הוא גם מאחזר אלמנט כפתור באמצעותquerySelector
ומוסיף מאזין לאירוע לחיצה (click). בעת לחיצה, הוא יוצר אלמנטdiv
חדש באמצעותcreateElement
ומוסיף אותו לתוכן הראשי. נעשה שימוש בג'נריקס והצהרות טיפוס (type assertions) כדי להבטיח בטיחות טיפוסים במהלך פעולות ה-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
, הוספת מחלקות (classes) בעזרתclassList
, וקביעת מאפיינים מותאמים אישית באמצעותsetAttribute
. הפעולות מתבצעות באופן בטוח טיפוסית (type-safe) בעזרת ג'נריקס.
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
, באפשרותך לבטל התנהגויות ברירת מחדל של שליחת טופס, כגון ניווט בדף או רענון. במקום זאת, תהליך מותאם אישית—לרישום פלט (logging)—מתבצע כאן.
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). אירועי 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
לזיהוי ורישום מתי שדה קלט מקבל או מאבד פוקוס.
הקלדה ב-TypeScript
בשימוש ב-TypeScript, בדיקת טיפוסים (Types) בשינוי DOM ופעולות על אירועים משופרת. להלן דוגמאות לשינוי DOM ולטיפול באירועים עם בדיקת טיפוס מובטחת ב-TypeScript.
מאזיני אירועים עם טיפוס מוגדר
בעת הוספת מאזיני אירועים, הגדרת סוג האירוע מאפשרת בדיקת טיפוס ומונעת גישה לתכונות שגויות.
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});
- הקוד הזה הוא דוגמה לשימוש במאזין אירועים עם טיפוס כדי לטפל באירועי קלט באופן בטוח ולקבל ולרשום את הערך הנוכחי של שדה הקלט.
טיפול כללי באירועים
שימוש בגנריות ב-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);
- הקוד הזה הוא דוגמה למטפל אירועים כללי (generic handler) באמצעות generics, אשר רושם את סוג האירוע ושם התג של האלמנט היעד.
סיכום
ב-TypeScript, הטיפוסים מוחלים על APIs סטנדרטיים של ה-DOM במהלך שינוי DOM וטיפול באירועים, ומשפרים את בטיחות הקריאה ואת קריאות הקוד. על ידי שימוש במחלקות כמו Document
ו-Element
, ובמחלקות הקשורות לאירועים כמו Event
, MouseEvent
, ו-KeyboardEvent
, ניתן לבצע פיתוח עם בדיקת טיפוס מובטחת. בנוסף, שימוש ב-querySelector<T>()
או HTMLCollectionOf<T>
מאפשר מניפולציות DOM בטוחות טיפוסית.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.