الأحداث في JavaScript ومشروع عدّاد الضغطات
في الدرس السابق غيّرت الصفحة بـ JavaScript، لكن التغيير حدث مرة واحدة عند التحميل. المواقع الحقيقية تستجيب لك: تضغط زراً فيحدث شيء، وتكتب حرفاً فتظهر النتيجة. في هذا الدرس ستتعلم الأحداث (Events)، ثم تبني مشروعك الأول الكامل: عدّاد ضغطات.
ما هو الحدث؟
Section titled “ما هو الحدث؟”الحدث هو شيء يحدث في الصفحة: ضغطة زر، أو كتابة حرف، أو تحريك الفأرة. وJavaScript تستطيع أن «تستمع» لأي حدث، وتنفّذ دالة عندما يقع.
تخيّل جرس الباب: لا تقف أمام الباب طوال اليوم تنتظر الضيوف، بل تفعل أشياءك، وعندما يرن الجرس (الحدث) تقوم وتفتح (الدالة). وهذا بالضبط ما تفعله الصفحة.
addEventListener
Section titled “addEventListener”لكي تستمع لحدث، اختر العنصر، ثم استدعِ addEventListener وأعطها اسم الحدث والدالة التي تُنفّذ:
const button = document.querySelector("#hello");
button.addEventListener("click", () => { console.log("تم الضغط على الزر!");});كلما ضغط المستخدم الزر، تُنفّذ الدالة. والدالة هنا سهمية، ويمكن أن تكون دالة عادية لها اسم:
function sayHello() { console.log("أهلاً!");}
button.addEventListener("click", sayHello);أحداث شائعة
Section titled “أحداث شائعة”| الحدث | متى يقع؟ |
|---|---|
click |
عند الضغط على العنصر |
input |
عند كل تغيير في حقل الكتابة |
keydown |
عند ضغط زر في لوحة المفاتيح |
mouseover |
عند مرور الفأرة فوق العنصر |
كائن الحدث والكتابة في الحقول
Section titled “كائن الحدث والكتابة في الحقول”الدالة تستقبل تلقائياً كائن الحدث (Event Object)، وفيه معلومات عما حدث. أهم خاصية فيه target، وهي العنصر الذي وقع عليه الحدث:
const nameInput = document.querySelector("#name");const greeting = document.querySelector("#greeting");
nameInput.addEventListener("input", (event) => { const name = event.target.value; greeting.textContent = name ? `أهلاً يا ${name}!` : "اكتب اسمك";});مع كل حرف تكتبه، يقع حدث input، فنقرأ القيمة الحالية من event.target.value ونعرضها. ولاحظ أننا استخدمنا المعامل الثلاثي من درس سابق!
المشروع: عدّاد الضغطات
Section titled “المشروع: عدّاد الضغطات”حان وقت تطبيق كل شيء. سنبني عدّاداً له ثلاثة أزرار: زيادة، ونقصان، وتصفير. ويتغير لون الرقم حسب قيمته.
الخطوة 1: HTML
Section titled “الخطوة 1: HTML”<p id="count">0</p><button id="minus">−</button><button id="reset">تصفير</button><button id="plus">+</button>الخطوة 2: المتغيرات واختيار العناصر
Section titled “الخطوة 2: المتغيرات واختيار العناصر”let count = 0;const display = document.querySelector("#count");الخطوة 3: دالة تحدّث الشاشة
Section titled “الخطوة 3: دالة تحدّث الشاشة”بدلاً من تكرار كود التحديث في كل زر، نجمعه في دالة واحدة. هذه فكرة يستخدمها المحترفون: البيانات في متغير، ودالة واحدة تعرضها:
function render() { display.textContent = count; if (count > 0) { display.style.color = "green"; } else if (count < 0) { display.style.color = "crimson"; } else { display.style.color = "gray"; }}الخطوة 4: ربط الأزرار بالأحداث
Section titled “الخطوة 4: ربط الأزرار بالأحداث”document.querySelector("#plus").addEventListener("click", () => { count++; render();});وبنفس الطريقة لزري النقصان والتصفير. والآن جرّب المشروع كاملاً:
جرّب بنفسك
Section titled “جرّب بنفسك”اضغط «شغّل»، ثم اضغط أزرار العدّاد في صندوق النتيجة. بعدها جرّب هذه التحديات:
- اجعل العدّاد لا ينزل تحت الصفر.
- أضف زراً يزيد العدد 10 مرة واحدة.
- اطبع في الطرفية رسالة عندما يصل العدد إلى 10.
الناتج
أخطاء شائعة
Section titled “أخطاء شائعة”- وضع قوسين بعد اسم الدالة:
addEventListener("click", sayHello())تنفّذ الدالة فوراً مرة واحدة. الصحيح بدون قوسين. - كتابة اسم الحدث بـ on: اسم الحدث
"click"وليس"onclick"عند استخدامaddEventListener. - الحساب بقيمة الحقل مباشرة:
input.value + 1تلصق النصوص، فتعطي"51"بدلاً من6. استخدمNumber(input.value) + 1.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي سطر يجعل الدالة play تعمل عند الضغط على الزر btn؟
نمرر الدالة نفسها بدون أقواس، واسم الحدث هو click بدون on.
سؤال
ما نوع القيمة التي تقرؤها من input.value؟
قيمة الحقل نص دائماً، حتى لو كانت أرقاماً، لذلك نحوّلها بـ Number قبل الحساب.
الخلاصة
Section titled “الخلاصة”- الحدث شيء يقع في الصفحة مثل
clickوinputوkeydown. element.addEventListener("click", دالة)تنفّذ الدالة كلما وقع الحدث.- مرّر الدالة بدون أقواس، وإلا ستُنفّذ فوراً.
- كائن الحدث يحمل معلومات، و
event.target.valueتعطيك ما كتبه المستخدم كنص. - فكرة «البيانات في متغير ودالة render تعرضها» تنظّم أي مشروع تفاعلي.
ماذا بعد؟
Section titled “ماذا بعد؟”أنهيت أساسيات JavaScript: المتغيرات والشروط والحلقات والدوال والمصفوفات والكائنات، والتحكم في الصفحة والاستجابة للمستخدم. في الدروس القادمة ستتعمق أكثر: دوال المصفوفات المتقدمة، و JSON، والمؤقتات، ومعالجة الأخطاء، والوعود وجلب البيانات من الإنترنت.