0Pricing
TypeScript Academy · درس

أنواع الأحداث والأحداث المخصصة؛ تضييق أنواع HTMLElement الفرعية

تعامل مع أحداث DOM بالأنواع الصحيحة، وأنشئ حمولات CustomEvent، وضيّق أنواع HTMLElement الفرعية بأمان.

أنواع الأحداث والأحداث المخصصة؛ تضييق أنواع HTMLElement الفرعية درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 3 دروس في المجموع.

مقدمة

الهدف: إضافة مستمعات أحداث مكتوبة الأنواع، وتضييق أنواع العناصر بأمان، وإطلاق CustomEvent مع حمولات.

  • أنواع الأحداث (MouseEvent وKeyboardEvent وInputEvent)
  • تضييق target/currentTarget باستخدام instanceof
  • حمولات detail في CustomEvent

مستمعات مكتوبة الأنواع

تُحدد أنواع توقيعات المستمعين بحسب اسم الحدث: click → MouseEvent وkeydown → KeyboardEvent. أضف تصريحات الأنواع صراحةً لمزيد من الوضوح.

const btn = document.querySelector("#btn");
if (btn) {
  btn.addEventListener("click", (ev: MouseEvent) => {
    console.log("x=", ev.clientX, "y=", ev.clientY);
  });
}

window.addEventListener("keydown", (ev: KeyboardEvent) => {
  console.log("key=", ev.key);
});

target مقابل currentTarget

target هو المصدر الأصلي وقد يكون من أنواع متعددة؛ أما currentTarget فهو العنصر الذي سُجّل عليه المستمع. ضيّق النوع باستخدام instanceof قبل استخدام واجهات برمجة العناصر.

document.addEventListener("input", (ev: InputEvent) => {
  const t = ev.target;
  const c = ev.currentTarget; // here: Document
  if (t instanceof HTMLInputElement) {
    console.log("value=", t.value);
  }
});

حمولة CustomEvent

يحمل CustomEvent<T> حمولة detail مكتوبة النوع. أطلق الحدث وتعامل معه باستخدام المعامل العام المطابق.

type CounterDetail = { delta: number };

const inc = new CustomEvent<CounterDetail>("counter:change", {
  detail: { delta: 1 }
});

document.dispatchEvent(inc);

document.addEventListener("counter:change", (ev: CustomEvent<CounterDetail>) => {
  console.log("delta=", ev.detail.delta);
});

تضييق النوع الفرعي

استخدم instanceof لتضييق النوع إلى فئات عناصر HTML محددة (مثل HTMLButtonElement وHTMLAnchorElement).

document.addEventListener("click", (ev: MouseEvent) => {
  const el = ev.target;
  if (el instanceof HTMLButtonElement) {
    el.disabled = true; // safe: HTMLButtonElement API
  } else if (el instanceof HTMLAnchorElement) {
    console.log("href=", el.href);
  }
});

التفويض + فحص الحماية

التفويض: استمع من مستوى عالٍ (document)، ثم ابحث عن عنصر مطابق وضيّق نوعه قبل الوصول إلى واجهات برمجته.

document.addEventListener("click", (ev: MouseEvent) => {
  const el = ev.target as Element | null;
  if (!el) return;
  const btn = el.closest("button.btn-primary");
  if (btn instanceof HTMLButtonElement) {
    console.log("delegated click on:", btn.textContent);
  }
});

التحقق من التضييق

تحقق سريع: ما الطريقة الأكثر أمانًا للوصول إلى واجهات برمجة خاصة بالعنصر داخل معالج أحداث؟

مراجعة

مراجعة: تشير أسماء الأحداث إلى أنواعها. استخدم instanceof لتضييق نوعَي target/currentTarget، وانقل البيانات في detail الخاص بـ CustomEvent<T>.

الأسئلة الشائعة

هل درس «أنواع الأحداث والأحداث المخصصة؛ تضييق أنواع HTMLElement الفرعية» مجاني؟

نعم — نص درس «أنواع الأحداث والأحداث المخصصة؛ تضييق أنواع HTMLElement الفرعية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 3 دروس في المجموع.

ماذا ستتعلم في «أنواع الأحداث والأحداث المخصصة؛ تضييق أنواع HTMLElement الفرعية»؟

تعامل مع أحداث DOM بالأنواع الصحيحة، وأنشئ حمولات CustomEvent، وضيّق أنواع HTMLElement الفرعية بأمان. تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «أنواع الأحداث والأحداث المخصصة؛ تضييق أنواع HTMLElement الفرعية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أنواع lib DOM و querySelector (التحقق الصارم من null)
  2. أنواع الأحداث والأحداث المخصصة؛ تضييق أنواع HTMLElement الفرعية
  3. التعامل مع FormData و URL و URLSearchParams
← العودة إلى TypeScript Academy