⚡ DOM و التفاعل مع الصفحة

10 / 12

التحكم بصفحة الويب — DOM 🌐

Document Object Model (DOM) هي الطريقة التي يتعامل بها JavaScript مع عناصر HTML.

محرر الكود
المخرجات
// اضغط ▶ تشغيل لرؤية النتائج...

تمرين

اكتب كود JavaScript يُنشئ جدول HTML ديناميكياً من مصفوفة بيانات.

`;\n\nconsole.log(\"كود HTML/JS لقائمة مهام تفاعلية جاهز!\");"; const LANG = "javascript"; let pyodide = null; function resetCode() { document.getElementById('code-editor').value = ORIGINAL_CODE; document.getElementById('code-output').textContent = '// اضغط ▶ تشغيل لرؤية النتائج...'; } async function runCode() { const code = document.getElementById('code-editor').value; const output = document.getElementById('code-output'); const btn = document.getElementById('run-btn'); const status = document.getElementById('exec-status'); btn.innerHTML = ' جاري التنفيذ...'; btn.disabled = true; output.textContent = '⏳ جاري التنفيذ...'; status.textContent = ''; try { if (LANG === 'python') { await runPython(code, output); } else if (LANG === 'javascript') { runJavaScript(code, output); } else if (LANG === 'html') { runHTML(code, output); } else { output.textContent = code; } status.innerHTML = '✅ تم التنفيذ'; } catch (err) { output.textContent = '❌ خطأ: ' + err.message; status.innerHTML = '❌ خطأ'; } btn.innerHTML = ' تشغيل'; btn.disabled = false; } async function runPython(code, output) { if (!pyodide) { output.textContent = '⏳ جاري تحميل بايثون (مرة واحدة فقط)...'; if (!window.loadPyodide) { await new Promise((resolve, reject) => { const s = document.createElement('script'); s.src = 'https://cdn.jsdelivr.net/pyodide/v0.25.1/full/pyodide.js'; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); } pyodide = await loadPyodide(); } pyodide.runPython('import sys; from io import StringIO; sys.stdout = StringIO()'); try { pyodide.runPython(code); const stdout = pyodide.runPython('sys.stdout.getvalue()'); output.textContent = stdout || '(لا يوجد مخرجات)'; } catch (e) { output.textContent = '❌ ' + e.message; } } function runJavaScript(code, output) { let logs = []; const fakeConsole = { log: (...args) => logs.push(args.map(a => typeof a === 'object' ? JSON.stringify(a, null, 2) : String(a)).join(' ')), error: (...args) => logs.push('❌ ' + args.join(' ')), warn: (...args) => logs.push('⚠️ ' + args.join(' ')), }; try { const fn = new Function('console', code); fn(fakeConsole); output.textContent = logs.join('\n') || '(لا يوجد مخرجات)'; } catch (e) { output.textContent = '❌ ' + e.message; } } function runHTML(code, output) { output.innerHTML = ''; } // Save progress function completeLesson() { const slug = "javascript-fundamentals"; const lessonId = 10; const p = JSON.parse(localStorage.getItem('cv-progress-' + slug) || '{"completed":[],"current":0}'); if (!p.completed.includes(lessonId)) p.completed.push(lessonId); p.current = lessonId; localStorage.setItem('cv-progress-' + slug, JSON.stringify(p)); const btn = document.getElementById('complete-btn'); btn.innerHTML = ' مكتمل! ✅'; btn.classList.add('opacity-70'); showToast('تم حفظ تقدمك! 🎉'); } // Auto-save code const editor = document.getElementById('code-editor'); const savedCode = localStorage.getItem('cv-code-javascript-fundamentals-10'); if (savedCode) editor.value = savedCode; editor.addEventListener('input', () => { localStorage.setItem('cv-code-javascript-fundamentals-10', editor.value); }); // Keyboard shortcuts editor.addEventListener('keydown', (e) => { if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') { e.preventDefault(); runCode(); } // Tab support if (e.key === 'Tab') { e.preventDefault(); const start = editor.selectionStart; editor.value = editor.value.substring(0, start) + ' ' + editor.value.substring(editor.selectionEnd); editor.selectionStart = editor.selectionEnd = start + 4; } }); // Mark as completed if already done document.addEventListener('DOMContentLoaded', () => { const p = JSON.parse(localStorage.getItem('cv-progress-javascript-fundamentals') || '{"completed":[]}'); if ((p.completed||[]).includes(10)) { const btn = document.getElementById('complete-btn'); btn.innerHTML = ' مكتمل ✅'; btn.classList.add('opacity-70'); } });