كيف تدرس هذا المسار؟
- افهم الفكرة ثم شغّل المعاينة إن وُجدت.
- عدّل الأرقام والنصوص في الكود لترى الفرق.
- ابنِ نسختك من المشروع النهائي.
- سجّل إكمال كل درس.
محتوى أصلي من 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.
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.
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.
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 يعرض حالة «متصل/غير متصل» ويُبدّلها بالنقر.
7. مشروع مصغّر — حاسبة
الهدف: تجمع inputs + دوال + events في أداة بسيطة.
input.value يقرأ ما كتبه المستخدم. Number(input.value) يحوّله لرقم.
الحاسبة: حقلان + زر «احسب» + span للنتيجة.
تحقق: إن القيمة فارغة أو NaN — اعرض رسالة خطأ بدل نتيجة غريبة.
هذا النمط (قراءة → حساب → عرض) يتكرر في كل أداة تفاعلية.
- document.getElementById('x').value
- Number() للتحويل
- isNaN() للتحقق
- عرض النتيجة في textContent
صورة ذهنية
[ input a ] [ input b ]
│
[ احسب ]
│
▼
النتيجة: ...
مختبر — حاسبة إجمالي
أضف حقل «خصم %» وعدّل الحساب ليطرح الخصم.
معاينة مباشرة
مهمة عملية
أضف أزرار «−» «×» «÷» ودوال لكل عملية.
8. التحقق من النماذج
الهدف: تمنع إرسال بيانات ناقصة أو خاطئة.
form.addEventListener('submit', function(e) { e.preventDefault(); ... })
preventDefault يوقف إرسال الصفحة الافتراضي — نتحقق أولاً.
تحقق شائع: الاسم غير فارغ، البريد فيه @، الرسالة أطول من 10 أحرف.
اعرض رسالة خطأ بجانب الحقل أو في div.alert — تجربة مستخدم أوضح من alert() فقط.
- submit + preventDefault
- trim() لإزالة المسافات
- includes('@') فحص بريد بسيط
- رسائل خطأ بالعربية
صورة ذهنية
إرسال
│
▼
[ تحقق ]
├─ OK → نجاح
└─ خطأ → رسالة
مختبر — فحص بريد
أضف حقل اسم وتحقق أن length >= 2.
معاينة مباشرة
مهمة عملية
أضف تحقق: الرسالة لا تقل عن 10 أحرف.
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.
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 مهام متبقية» يتحدّث.
صفحتك لم تعد ثابتة — صارت تتفاعل
انشر أداة صغيرة (نصائح أو مهام) ضمن صفحتك الشخصية، ثم تعمّق في بايثون أو Cursor.