מחלקות המשמשות לטיפול ב-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 בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.