الفئات المستخدمة للتعامل مع 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 أيضًا.۔