الأحداث
الصفحة تنتظر الزائر: يضغط، فتستجيب. ⏱ نحو 25 دقيقة.
- تربط حدثًا بدالة بـ
addEventListener. - تبني عدّادًا بمتغيّر يتذكر القيمة.
- تستخدم أحداث
clickوinputوmouseenter. - تستخدم
event.targetلمعرفة العنصر المضغوط.
١الحدث: شيء يفعله الزائر
ضغط زر، أو كتابة حرف، أو مرور الفأرة… كلها أحداث. نطلب من المتصفح: «حين يحدث كذا على هذا العنصر، نفّذ هذه الدالة». هذا هو addEventListener:
<button id="btn">قل مرحبًا</button><p id="out"></p><script src="script.js"></script>
const btn = document.querySelector("#btn");const out = document.querySelector("#out"); btn.addEventListener("click", function () { out.textContent = "مرحبًا بك في مقهى بُنّ! ☕";});
اضغط الزر في المعاينة. الدالة لا تعمل عند تحميل الصفحة، بل تنتظر الضغطة. ثلاثة أجزاء: العنصر، ثم اسم الحدث، ثم الدالة.
٢عدّاد: متغيّر يتذكر
<button id="minus">−</button><span id="count">0</span><button id="plus">+</button><script src="script.js"></script>
button { font-size: 20px; width: 40px; }#count { font-size: 24px; margin: 0 12px; }
let count = 0;const show = document.querySelector("#count"); document.querySelector("#plus").addEventListener("click", function () { count++; show.textContent = count;}); document.querySelector("#minus").addEventListener("click", function () { if (count > 0) { count--; show.textContent = count; }});
المتغيّر count معرّف خارج الدوال، فيبقى محفوظًا بين الضغطات. وهكذا تُبنى سلة المشتريات في المتاجر.
٣الوضع الليلي بسطر واحد
classList.toggle مع حدث الضغط: أشهر حيلة في الواجهات:
<button id="theme">🌙 الوضع الليلي</button><p>نص الصفحة.</p><script src="script.js"></script>
body { transition: background 0.3s; }.dark { background: #1E1F22; color: #eee; }
document.querySelector("#theme").addEventListener("click", function () { document.body.classList.toggle("dark");});
٤أحداث أخرى
<input id="name" placeholder="اكتب اسمك"><p>أهلًا <b id="hello"></b></p><div id="box">مرّر الفأرة هنا</div><script src="script.js"></script>
#box { padding: 16px; background: #EEE; margin-top: 8px; }const nameInput = document.querySelector("#name");nameInput.addEventListener("input", function () { document.querySelector("#hello").textContent = nameInput.value;}); const box = document.querySelector("#box");box.addEventListener("mouseenter", function () { box.style.background = "#FFF3CD";});box.addEventListener("mouseleave", function () { box.style.background = "#EEE";});
| الحدث | متى يقع؟ |
|---|---|
click | الضغط. |
input | كل تغيير في محتوى حقل الإدخال. نقرأ القيمة بـ .value. |
change | بعد اختيار قيمة من قائمة منسدلة أو مربع اختيار. |
mouseenter و mouseleave | دخول الفأرة وخروجها. |
keydown | ضغط مفتاح في لوحة المفاتيح. |
submit | إرسال نموذج (الدرس القادم). |
٥كائن الحدث event
الدالة تستقبل معلومات عن الحدث في معامل نسميه عادة event أو e:
<p>اضغط أي زر:</p><button>قهوة</button> <button>شاي</button> <button>عصير</button><script src="script.js"></script>
const buttons = document.querySelectorAll("button");for (const b of buttons) { b.addEventListener("click", function (event) { console.log("اخترت:", event.target.textContent); });}
event.target هو العنصر الذي وقع عليه الحدث. هكذا كتبنا دالة واحدة لثلاثة أزرار.
توقّع وتحقّق
ما وظيفة addEventListener؟
اسم حدث الضغط:
on.قراءة ما كتبه الزائر في حقل:
value.أين نعرّف متغيّر العدّاد؟
الخلاصة
element.addEventListener("click", function (){ … }) تنفّذ الدالة عند الحدث.- أسماء الأحداث بلا
on: clickوinputوchangeوkeydown. - المتغيّر خارج الدالة يبقى محفوظًا بين الضغطات.
input.valueلقراءة ما كُتب، وevent.targetللعنصر الذي وقع عليه الحدث.
تحدٍّ برمجي: عدّاد الأكواب
متوسطاكتب في script.js عدّاد أكواب القهوة: زر + يزيد، وزر − ينقص (لا يقل عن صفر)، وزر «تصفير» يعيده إلى صفر، ويظهر السعر الإجمالي (الكوب بـ 12) في #total.
- زر #plus يزيد #count بواحد.
- زر #minus ينقص واحدًا، ولا ينزل تحت 0.
- زر #reset يعيد العدد إلى 0.
- بعد كل ضغطة تُكتب في #total: الإجمالي: (العدد × 12)
👀 اعرض شكل الناتج المطلوب
- زر + يزيد العدد بواحد.
- زر − ينقص واحدًا.
- زر التصفير يعيده إلى 0.
- لا ينزل تحت الصفر.
- #total يعرض الإجمالي الصحيح.
💡 تلميح 1
show() تحدّث #count و #total، واستدعها بعد كل تغيير.💡 تلميح 2
if (count > 0) { count--; }حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
<button id="minus">−</button><span id="count">0</span><button id="plus">+</button><button id="reset">تصفير</button><p id="total">الإجمالي: 0</p><script src="script.js"></script>
let count = 0; function show() { document.querySelector("#count").textContent = count; document.querySelector("#total").textContent = `الإجمالي: ${count * 12}`;} document.querySelector("#plus").addEventListener("click", function () { count++; show();});document.querySelector("#minus").addEventListener("click", function () { if (count > 0) { count--; show(); }});document.querySelector("#reset").addEventListener("click", function () { count = 0; show();});