الفئات المستخدمة للتعامل مع DOM / التعامل مع الأحداث في TypeScript
في هذه المقالة، سنشرح الفئات المستخدمة للتعامل مع DOM / التعامل مع الأحداث في TypeScript۔
يمكنك تعلم المزيد عن فئة Document
، والفئات Element
وNodeList
، ومختلف الفئات المتعلقة بالأحداث من خلال أمثلة الكود.۔
YouTube Video
الفئات المستخدمة للتعامل مع DOM / التعامل مع الأحداث في TypeScript
للتعامل مع DOM والتعامل مع الأحداث في TypeScript، يتم استخدام واجهات نموذج كائن المستند
(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
ويضيف مستمع حدث النقر له۔ عند النقر، ينشئ عنصرdiv
جديد باستخدامcreateElement
ويضيفه إلى المحتوى الرئيسي۔ تُستخدم الأنواع العامة وفرضيات النوع لضمان أمان النوع أثناء عمليات DOM۔
Element
Element
هو واجهة تمثل العناصر الفردية في 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
هي خاصية للتحكم في الأصناف (classes)، وتتيح لك إضافة الأصناف أو حذفها أو تبديلها۔- طريقة
setAttribute
تقوم بتعيين خاصية (Attribute) على العنصر۔
شرح الكود
- يعرض هذا الكود مثالاً على تعيين المحتوى باستخدام
innerHTML
وtextContent
للعناصر التي تم جلبها بواسطةquerySelector
، إضافة الفئات باستخدامclassList
، وتعيين خصائص مخصصة باستخدامsetAttribute
۔ تتم العمليات بطريقة آمنة من ناحية النوع باستخدام الأنواع العامة۔
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
لاكتشاف وتسجيل عندما يحصل حقل الإدخال على التركيز أو يفقده۔
التصنيف في TypeScript
عند استخدام TypeScript، يتم تحسين التحقق من الأنواع عند التعامل مع DOM ومعالجة الأحداث۔ فيما يلي أمثلة على التعامل الآمن مع DOM ومعالجة الأحداث في TypeScript۔
الاستماع للأحداث مع التصنيف (Typed Event Listeners)
عند إضافة مستمعين للأحداث، يساعد تحديد نوع الحدث على التحقق من الأنواع ومنع الوصول إلى الخصائص غير الصحيحة۔
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});
- هذا الكود مثال على استخدام مستمع أحداث مضبوط النوع لمعالجة أحداث الإدخال والحصول بشكل آمن على وتسجيل القيمة الحالية لحقل الإدخال۔
معالجة الأحداث العامة
باستخدام الأنماط العامة (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);
- هذا الكود مثال على معالج أحداث عام يستخدم القوالب (Generics)، حيث يسجل نوع الحدث واسم الوسم (Tag name) للعنصر المستهدف۔
الملخص
في TypeScript، يتم تطبيق الأنواع على واجهات برمجة DOM القياسية أثناء التلاعب بـDOM ومعالجة الأحداث، مما يعزز أمان الكود وقابليته للقراءة۔ من خلال استخدام الفصول مثل Document
و Element
، والفصول المرتبطة بالأحداث مثل Event
، وMouseEvent
، وKeyboardEvent
، يمكن تحقيق تطوير آمن من حيث الأنواع۔ بالإضافة إلى ذلك، يتيح استخدام querySelector<T>()
أو HTMLCollectionOf<T>
إجراء عمليات آمنة من ناحية النوع على DOM۔
يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔