مبتدئ → تطبيقي · 10 دروس

JavaScript للمتصفح — تفاعل وواجهات

تعلّم كيف تجعل صفحتك تستجيب: أزرار، نصوص متغيّرة، حاسبة بسيطة، وتحقق من النماذج — خطوة بخطوة بالعربية.

كيف تدرس هذا المسار؟

  1. افهم الفكرة ثم شغّل المعاينة إن وُجدت.
  2. عدّل الأرقام والنصوص في الكود لترى الفرق.
  3. ابنِ نسختك من المشروع النهائي.
  4. سجّل إكمال كل درس.

محتوى أصلي من Mesue Learn — عملي ومناسب لسن +12 وما فوق.

1. ماذا يفعل JavaScript في المتصفح؟

الهدف: تميّز بين HTML و CSS و JS ومتى تحتاج كل واحدة.

HTML يبني الهيكل. CSS يزيّن. JavaScript (JS) يضيف السلوك: عند النقر يتغيّر النص، عند الإدخال تُحسب النتيجة، عند الإرسال تُفحص البيانات.

JS في المتصفح يعمل داخل <script> أو ملف .js منفصل. لا يحتاج تثبيت — المتصفح ينفّذه مباشرة.

بعد مسار HTML/CSS، JS هو الخطوة التالية لتقديم صفحات «حيّة» للعملاء — حاسبة أسعار، نموذج ذكي، أو لوحة مهام بسيطة.

  • JS = منطق وتفاعل داخل المتصفح
  • <script> في نهاية body أو ملف خارجي
  • console.log() للتجربة في أدوات المطوّر
  • ابدأ بمهام صغيرة قبل مشاريع كبيرة

صورة ذهنية

HTML (هيكل)
   +
CSS (شكل)
   +
JS (سلوك)
   ═══════
صفحة تفاعلية

مختبر — أول سطر JS

افتح أدوات المطوّر (F12) → Console ولاحظ رسالة log.

مهمة عملية

غيّر النص المعروض إلى جملة تعريف بك، واطبع اسمك في console.

اختبر فهمك

أين يُكتب JavaScript عادة في صفحة بسيطة؟

2. المتغيرات — let و const

الهدف: تخزّن قيماً بأسماء واضحة وتستخدمها لاحقاً.

let للقيم التي قد تتغيّر: let count = 0;
const للثابت: const siteName = 'Mesue Learn';

أنواع شائعة: نص (string)، رقم (number)، true/false (boolean).

تسمية واضحة: price بدل x، userName بدل n — يسهّل القراءة وعملك مع العملاء.

  • let متغير، const ثابت
  • النص بين '' أو \"\"
  • typeof(x) يكشف النوع
  • const افتراضياً إن لم تتغيّر القيمة

صورة ذهنية

const name = "سارة"
let score = 0
score = score + 10
// name ثابت · score يتغيّر

مختبر — حساب سعر

غيّر discount ولاحظ finalPrice — المتغير let يسمح بالتحديث.

مهمة عملية

أضف const currency = 'ر.س' واطبع جملة: «المنتج X بسعر Y ر.س».

اختبر فهمك

أي كلمة للقيمة التي لن تتغيّر؟

3. الشروط — if و else

الهدف: تتخذ قرارات في الكود حسب القيم.

if (شرط) { ... } else if (شرط_آخر) { ... } else { ... }

عوامل المقارنة: === !== < > <= >=

مثال عملي: إن كان الطلب > 500 فالشحن مجاني، وإلا 25 ر.س.

=== يقارن القيمة والنوع — أفضل من == في معظم الحالات.

  • if (score >= 60) ناجح
  • else للحالة الباقية
  • && و || لدمج شروط
  • === للمساواة الصارمة

صورة ذهنية

if (total >= 500)
  → شحن مجاني
else
  → شحن 25

مختبر — شحن مجاني

جرّب orderTotal = 300 و 500 — لاحظ نقطة التحوّل.

مهمة عملية

أضف else if: إن total >= 300 الشحن 15 بدل 25.

اختبر فهمك

ماذا يعني === في JavaScript؟

4. الدوال — function

الهدف: تغلف منطقاً قابلاً لإعادة الاستخدام.

function greet(name) {
return 'أهلاً ' + name;
}

الدالة تأخذ مدخلات (parameters) وترجع نتيجة بـ return.

function calcTotal(price, qty) { return price * qty; } — تستدعيها: calcTotal(50, 3).

الدوال تجعل الكود أنظف: بدل تكرار نفس الحساب، استدعِ دالة واحدة.

  • function name(args) { return ... }
  • return ينهي الدالة ويرجع قيمة
  • استدعاء: name(قيم)
  • دالة = وحدة قابلة للاختبار

صورة ذهنية

calcTotal(50, 3)
      │
      ▼
[ function ] → 150
      │
      ▼
  استخدم النتيجة

مختبر — دوال الأسعار

اكتب دالة applyDiscount(price, percent) واستخدمها قبل formatPrice.

مهمة عملية

أنشئ دالة isFreeShipping(total) ترجع true إن total >= 500.

اختبر فهمك

ماذا تفعل return داخل دالة؟

5. الأحداث — النقر على زر

الهدف: تشغّل كوداً عندما يفعل المستخدم شيئاً.

addEventListener يربط حدثاً بدالة:

button.addEventListener('click', function() { ... });

أحداث شائعة: click، input، submit، keydown.

النمط: 1) اختر العنصر 2) اسمع للحدث 3) نفّذ الدالة.

هذا أساس كل زر «اشترِ»، «أظهر المزيد»، أو «احسب» في مواقع العملاء.

  • querySelector أو getElementById
  • addEventListener('click', handler)
  • لا تنس id أو class للعنصر
  • handler = دالة بدون () عند التسجيل

صورة ذهنية

[ زر ]
  click
    │
    ▼
[ handler() ]
    │
    ▼
تغيير في الصفحة

مختبر — عدّاد نقرات

لاحظ: نمرّر الدالة بدون أقواس () — وإلا تُنفَّذ فوراً.

معاينة مباشرة

مهمة عملية

أضف زر «إعادة» يصفّر العداد إلى 0.

اختبر فهمك

أي حدث عند ضغط المستخدم على زر؟

6. تغيير النص — DOM

الهدف: تقرأ وتعدّل محتوى عناصر HTML من JS.

DOM = تمثيل الصفحة كشجرة عناصر يمكن لـ JS قراءتها وتعديلها.

document.getElementById('id')
document.querySelector('.class')

element.textContent = 'نص جديد' — للنص الصرف
element.innerHTML — لل HTML (احذر XSS)

element.classList.add('active') — لإضافة class CSS.

  • textContent آمن للنص العادي
  • querySelector يختار أول عنصر مطابق
  • classList.toggle('hidden')
  • DOM = الجسر بين JS و HTML

صورة ذهنية

JS ──▶ getElementById
         │
         ▼
      [ <p> ]
         │
    textContent = "..."

مختبر — تحديث عنوان

جرّب classList.add على عنصر div لتفعيل CSS مختلف.

معاينة مباشرة

مهمة عملية

أنشئ span يعرض حالة «متصل/غير متصل» ويُبدّلها بالنقر.

اختبر فهمك

أي خاصية لتغيير النص دون HTML؟

7. مشروع مصغّر — حاسبة

الهدف: تجمع inputs + دوال + events في أداة بسيطة.

input.value يقرأ ما كتبه المستخدم. Number(input.value) يحوّله لرقم.

الحاسبة: حقلان + زر «احسب» + span للنتيجة.

تحقق: إن القيمة فارغة أو NaN — اعرض رسالة خطأ بدل نتيجة غريبة.

هذا النمط (قراءة → حساب → عرض) يتكرر في كل أداة تفاعلية.

  • document.getElementById('x').value
  • Number() للتحويل
  • isNaN() للتحقق
  • عرض النتيجة في textContent

صورة ذهنية

[ input a ] [ input b ]
        │
     [ احسب ]
        │
        ▼
    النتيجة: ...

مختبر — حاسبة إجمالي

أضف حقل «خصم %» وعدّل الحساب ليطرح الخصم.

معاينة مباشرة

مهمة عملية

أضف أزرار «−» «×» «÷» ودوال لكل عملية.

اختبر فهمك

كيف تقرأ قيمة حقل input من JS؟

8. التحقق من النماذج

الهدف: تمنع إرسال بيانات ناقصة أو خاطئة.

form.addEventListener('submit', function(e) { e.preventDefault(); ... })

preventDefault يوقف إرسال الصفحة الافتراضي — نتحقق أولاً.

تحقق شائع: الاسم غير فارغ، البريد فيه @، الرسالة أطول من 10 أحرف.

اعرض رسالة خطأ بجانب الحقل أو في div.alert — تجربة مستخدم أوضح من alert() فقط.

  • submit + preventDefault
  • trim() لإزالة المسافات
  • includes('@') فحص بريد بسيط
  • رسائل خطأ بالعربية

صورة ذهنية

إرسال
  │
  ▼
[ تحقق ]
  ├─ OK → نجاح
  └─ خطأ → رسالة

مختبر — فحص بريد

أضف حقل اسم وتحقق أن length >= 2.

معاينة مباشرة

مهمة عملية

أضف تحقق: الرسالة لا تقل عن 10 أحرف.

اختبر فهمك

لماذا e.preventDefault() في submit؟

9. ربط JS بصفحة HTML كاملة

الهدف: تنظّم ملف HTML + script منفصل أو داخلي.

للمشاريع الصغيرة: script في نهاية body قبل </body> — HTML يُحمّل أولاً.

للمشاريع الأكبر: <script src="app.js" defer></script> في head.

قسّم منطقك: دوال في الأعلى، event listeners في الأسفل، أو ملف modules لاحقاً.

اربط هذا بصفحتك من مسار WEB — نفس index.html + app.js للتفاعل.

  • script في آخر body = عناصر جاهزة
  • src=\"app.js\" لملف خارجي
  • defer يحمّل JS دون حجب HTML
  • فصل المحتوى عن السلوك

صورة ذهنية

index.html
   ├── styles.css
   └── app.js
         │
    addEventListener
         │
    عناصر الصفحة

مختبر — ملفان

أنشئ index.html و app.js في مجلد واحد — افتح index من المتصفح.

مهمة عملية

انقل حاسبة الدرس 7 إلى app.js منفصل مربوط بصفحة HTML.

اختبر فهمك

أين نضع <script src=\"app.js\"> غالباً للصفحات البسيطة؟

10. مشروع نهائي — قائمة مهام

الهدف: تبني mini-project تفاعلي كامل من الصفر.

قائمة مهام (Todo): حقل إدخال + زر «أضف» + ul للعناصر.

عند الإضافة: أنشئ li، ضع النص، أضف زر «تم» يشطب المهمة.

بديل: مولّد نصائح عشوائي من مصفوفة — أبسط إن أردت.

هذا المشروع يجمع: DOM، events، arrays، وconditions — جاهز للعرض في ملفك أو كdemo لعميل.

  • مصفوفة tasks = [] أو إضافة li مباشرة
  • createElement + appendChild
  • classList.add('done') للشطب
  • ابدأ بسيط — حسّن لاحقاً

صورة ذهنية

[ input ] [ أضف ]
      │
      ▼
  • مهمة 1 [تم]
  • مهمة 2 [تم]
  • مهمة 3

مختبر — Todo List

أضف Enter في input لإضافة مهمة — keydown === 'Enter'.

معاينة مباشرة

مهمة عملية

أكمل المشروع: 3 مهام افتراضية + عدّاد «X مهام متبقية» يتحدّث.

اختبر فهمك

أفضل خطوة بعد إنهاء مسار JS؟

صفحتك لم تعد ثابتة — صارت تتفاعل

انشر أداة صغيرة (نصائح أو مهام) ضمن صفحتك الشخصية، ثم تعمّق في بايثون أو Cursor.