← القائمة
LESSON 08 · HTML WITH JAVASCRIPT

HTML مع JavaScript
أضف الحياة لصفحاتك

تعلّم كيف يتواصل JavaScript مع HTML — كل سطر ماذا يفعل، ولماذا، ومتى تستخدمه.

المفهوم الأساسي

🔌 كيف يتصل JavaScript بصفحة HTML؟

JavaScript لغة برمجة تعمل في المتصفح. هي تقرأ وتعدّل HTML في الوقت الفعلي دون الحاجة لتحديث الصفحة. هذا ما يجعل المواقع "حية".

3 طرق لإضافة JavaScript:
1️⃣ Inline: onclick="doSomething()" مباشرة في الـ tag — للاستخدام السريع فقط
2️⃣ Internal: <script>...</script> داخل HTML — للصفحات البسيطة
3️⃣ External: <script src="app.js"> — الأفضل دائماً للمشاريع الحقيقية
adding-js.html — الطرق الثلاث
1
<!DOCTYPE html>
الهيكل الأساسي
2
<html lang="ar" dir="rtl">
3
<head>
4
<meta charset="UTF-8">
5
<title>HTML + JS</title>
6
<!── الطريقة 3: ملف خارجي — يجب أن يكون قبل </head> ──>
7
<script src="app.js" defer></script>
defer: ينفّذ بعد تحميل HTML كاملاً
8
</head>
9
<body>
10
 
11
<!── الطريقة 1: Inline — مباشرة في الـ tag ──>
سريعة لكن صعبة الصيانة
12
<button onclick="alert('مرحباً!')">اضغط هنا</button>
onclick ينفّذ JS لحظة الضغط
13
 
14
<!── الطريقة 2: Internal — tag script ──>
في آخر body أو في head مع defer
15
<script>
كل ما داخله JavaScript
16
console.log("الصفحة محمّلة!");
يطبع في Developer Tools
17
</script>
إغلاق tag الـ script
18
</body>
19
</html>
⚠️ لماذا JS في آخر body أو مع defer؟ عندما يصل المتصفح لـ <script> يتوقف عن تحميل HTML ويُنفّذ JS أولاً. لو JS يحاول الوصول لعنصر لم يُحمَّل بعد → خطأ! الحل: defer أو وضع الـ script قبل </body>.
القسم الأول

🎯 الوصول لعناصر HTML من JavaScript

الـ DOM (Document Object Model) هو تمثيل HTML كشجرة من الكائنات التي يمكن لـ JavaScript قراءتها وتعديلها.

dom-access.html + dom-access.js
1
<!── HTML: عناصر ستُعدَّل ──>
في ملف HTML
2
<h1 id="page-title">العنوان الأصلي</h1>
id يُستخدم للوصول السريع المباشر
3
<p class="info">نص أول</p>
class يُستخدم لتحديد مجموعة
4
<p class="info">نص ثانٍ</p>
نفس الـ class
5
<button id="myBtn">اضغط</button>
زر للتفاعل
6
<div data-product="laptop">لاب توب</div>
data-* للبيانات المخصصة
7
 
8
// JavaScript: طرق الوصول للعناصر
في ملف JS أو script tag
9
 
10
// 1. getElementById — الأسرع (بالـ id)
11
const title = document.getElementById('page-title');
يُرجع عنصراً واحداً أو null
12
 
13
// 2. querySelector — الأكثر مرونة (CSS selector)
14
const btn = document.querySelector('#myBtn');
بالـ id مع #
15
const first = document.querySelector('.info');
أول .info فقط
16
const h2 = document.querySelector('h2');
أول h2 في الصفحة
17
const prod = document.querySelector('[data-product="laptop"]');
بقيمة data attribute — قوي جداً
18
 
19
// 3. querySelectorAll — يُرجع كل المطابقين
20
const all = document.querySelectorAll('.info');
NodeList — تحتاج forEach للمرور عليها
21
all.forEach(el => console.log(el.textContent));
el.textContent يقرأ النص داخل العنصر
القسم الثاني

✏️ تعديل العناصر برمجياً

modify-dom.js — كل أنواع التعديل
1
const el = document.getElementById('myElement');
احصل على العنصر أولاً
2
 
3
// ─── تعديل المحتوى ───
4
el.textContent = "نص جديد آمن";
textContent: نص فقط — لا يُشغّل HTML — آمن
5
el.innerHTML = "<strong>نص غامق</strong>";
innerHTML: يُشغّل HTML — خطر XSS إذا من مستخدم
6
el.innerText = "نص مرئي";
innerText: يأخذ CSS بالحسبان (يتجاهل hidden)
7
 
8
// ─── تعديل الـ CSS ───
9
el.style.color = "#39ff14";
خاصية CSS واحدة مباشرة
10
el.style.backgroundColor = "#0f1219";
background-color → backgroundColor (camelCase في JS)
11
el.style.display = "none";
يُخفي العنصر تماماً
12
el.style.display = "block";
يُظهره مجدداً
13
 
14
// ─── classList: الطريقة الأفضل للـ CSS ───
بدل style مباشرة
15
el.classList.add('active');
يُضيف class — لا يحذف الكلاسات الأخرى
16
el.classList.remove('hidden');
يحذف class
17
el.classList.toggle('dark-mode');
إذا موجود يحذفه، إذا لا يُضيفه
18
el.classList.contains('active');
يُرجع true/false — للتحقق
19
 
20
// ─── تعديل الـ Attributes ───
21
el.setAttribute('href', 'https://new-url.com');
يُعيّن قيمة أي attribute
22
el.getAttribute('href');
يقرأ قيمة attribute
23
el.removeAttribute('disabled');
يحذف attribute — مثالي لتفعيل الأزرار
24
el.dataset.userId;
يقرأ data-user-id بسهولة
القسم الثالث

🎧 الأحداث (Events) — قلب التفاعل

الـ Event هو أي شيء يحدث في الصفحة: ضغطة، تحرك ماوس، كتابة، تحميل. JavaScript يستمع لهذه الأحداث ويستجيب لها.

events.js — كل أنواع الأحداث
1
const btn = document.querySelector('#myBtn');
احصل على الزر
2
 
3
// ─── addEventListener — الطريقة الصحيحة ───
4
btn.addEventListener('click', (event) => {
'click' = نوع الحدث. event = معلومات الحدث
5
console.log('تم الضغط!');
6
console.log(event.target);
event.target = العنصر الذي أطلق الحدث
7
});
8
 
9
// ─── أشهر الأحداث ───
10
btn.addEventListener('click', fn);
نقرة واحدة
11
btn.addEventListener('dblclick', fn);
نقرتان متتاليتان
12
el.addEventListener('mouseover', fn);
الماوس يدخل العنصر
13
el.addEventListener('mouseout', fn);
الماوس يخرج من العنصر
14
input.addEventListener('input', fn);
عند كل حرف يُكتب في الحقل — مثالي للبحث الفوري
15
input.addEventListener('change', fn);
بعد مغادرة الحقل (blur) والقيمة تغيرت
16
input.addEventListener('focus', fn);
عند النقر على الحقل (يصبح نشطاً)
17
input.addEventListener('blur', fn);
عند مغادرة الحقل
18
document.addEventListener('keydown', fn);
ضغط مفتاح في لوحة المفاتيح
19
window.addEventListener('scroll', fn);
تمرير الصفحة
20
window.addEventListener('load', fn);
الصفحة وكل مواردها محمّلة
21
document.addEventListener('DOMContentLoaded', fn);
HTML محمّل (بدون انتظار الصور) — أسرع من load

🛠️ مثال تطبيقي: زر تغيير المظهر

اكتب الكود:
النتيجة المباشرة:
القسم الرابع

🏗️ إنشاء وحذف عناصر HTML برمجياً

create-remove.js
1
// ─── إنشاء عنصر جديد ───
2
const card = document.createElement('div');
ينشئ div في الذاكرة — لم يُضَف للصفحة بعد
3
card.className = 'product-card';
يضيف class
4
card.id = 'card-1';
يضيف id
5
card.innerHTML = `
template literal للمحتوى المتعدد الأسطر
6
<h3>اسم المنتج</h3>
7
<p>الوصف هنا</p>
8
<button>شراء</button>
9
`;
10
 
11
// ─── إضافة العنصر للصفحة ───
12
const container = document.getElementById('products');
الأب الذي سيحتوي البطاقة
13
container.appendChild(card);
يُضيف العنصر كآخر ابن في container
14
container.prepend(card);
يُضيف كأول ابن
15
container.insertAdjacentHTML('beforeend', '<p>جديد</p>');
الأسرع لإضافة HTML مباشرة
16
 
17
// ─── حذف عنصر ───
18
card.remove();
يحذف العنصر من الصفحة مباشرة
19
container.innerHTML = '';
يحذف كل الأبناء دفعة واحدة

📋 مثال كامل: قائمة مهام ديناميكية

التطبيق الكامل:
النتيجة:

🧠 اختبار HTML مع JavaScript

5 أسئلة تختبر فهمك للربط بين HTML وJS

س1: ما الفرق بين textContent و innerHTML؟

س2: ما وظيفة classList.toggle('dark')؟

س3: ما الفرق بين querySelector و querySelectorAll؟

س4: لماذا نضع defer في tag الـ script؟

س5: ما الكود الصحيح للاستماع لحدث الكتابة في حقل بحث؟

const searchInput = document.querySelector('#search');