إنشاء العناصر
على لوحة الفلين في المطبخ ورقة واحدة مثبّتة من قبل: milk. القائمة هي #board. تلك الورقة عنصر li معرّفه milk. الترميز في سطر واحد، فلا عقدة نص فارغة من سطر جديد.
تريد أن تضيف tea و bread و eggs. لا تبنِ الوسم من نص. document.createElement("li") يعطيك li جديدًا ليس في الصفحة بعد. parentElement يساوي null. document.body.contains يساوي false. طول children للوحة يبقى 1، لأن milk وحده هناك.
textContent = "tea" يكتب الكلمة على ذلك الكائن ولا يعلّقه بالصفحة.
board.append(tea) يضعه آخر القائمة. نتيجة النداء undefined. لا يُرجع العقدة. appendChild يعيد العقدة نفسها؛ هذه الصفحة تستعمل append. prepend يضع الخبز أولًا. insertBefore(eggs, milk) يضع البيض قبل milk مباشرة، لأن milk ابن اللوحة أصلًا. الترتيب: bread ثم eggs ثم milk ثم tea. طول children يصير 4.
تجربة جانبية على اللوحة الأصلية فقط: createTextNode("salt"). هذه عقدة نص، ليست li. بعد إلحاقها يبقى children مساويًا 1. childNodes يصير 2 بدل 1. nodeType يساوي 3. آخر عنصر ما زال milk. عرض الصفحة لا يُلحق الملح.
السطر تحت اللوحة: bread / eggs / milk / 4. كلمة tea في القائمة وليست في هذا السطر. الرقم 4 هو عدد العناصر. نص milk يبقى milk. لا تكتب خاصية CSS هنا.
عقد جديدة، لا طبقة لون
الصفحة السابقة كتبت style و setProperty و classList و cssText على شريحة لون. لم تنشئ عقدة. الصفحة التي قبلها غيّرت الكلمات بـ textContent و innerHTML و insertAdjacentHTML. هنا لا تسند style، ولا تحلّل سلسلة HTML، ولا تعيد كتابة كلمة milk. getElementById يعطيك اللوحة وعنصر milk فقط. الصفوف الجديدة تأتي من createElement.
أين تستقر كل عقدة
اللوحة تبدأ بعنصر li واحد: milk. اقرأ الصفوف بالترتيب. صف الملح تجربة جانبية على اللوحة الأصلية، قبل وجود tea و bread و eggs. عرض الصفحة يتوقف عند insertBefore ولا يلحق الملح.
📊 أين تستقر كل عقدة
| النداء | موضع العقدة الجديدة | أبناء العناصر | الخلط الشائع |
|---|---|---|---|
createElement("li") |
لا مكان؛ parentElement هو null |
ما زال 1، وهو milk | ظن أن العنصر ظاهر على اللوحة |
textContent = "tea" |
ما زال بلا مكان | ما زال 1 | ظن أن الكلمة نفسها تُدرج li |
append(tea) |
في الآخر؛ نتيجة النداء undefined |
2: milk ثم tea | انتظار أن يعيد append العقدة |
prepend(bread) |
في الأول | 3: bread ثم milk ثم tea | تبديل prepend مع append |
insertBefore(eggs, milk) |
قبل milk مباشرة | 4: bread ثم eggs ثم milk ثم tea | مرجع ليس ابنًا للوحة |
append(createTextNode("salt")) على اللوحة الجديدة |
عقدة نص بعد milk، ليست li |
ما زال 1 | صيرورة children.length إلى 2 |
createElement يبني العقدة في الذاكرة. اللوحة لا تتغير حتى تضعها دالة. children يعدّ عناصر فقط. عقدة النص موجودة في childNodes وليست في children. append و prepend نتيجتهما undefined. appendChild يعيد العقدة التي مرّرتها. append يقبل عقدة أو سلسلة؛ السلسلة تصبح عقدة نص. appendChild يقبل عقدة، والسلسلة ترمي خطأ. insertBefore يريد مرجعًا هو ابن ذلك الأب مسبقًا. إن مرّرت null مرجعًا، تذهب العقدة إلى الآخر، كفكرة append. هذه الصفحة تمرّر milk لا null. إلحاق عقدة موجودة أصلًا على اللوحة ينقلها ولا ينسخها.
عنصر li الجديد ليس على اللوحة بعد
الملف يفتح بالقائمة ذات السطر الواحد. لم يُنشأ شيء. القراءات الأربع تسأل العقدة الجديدة واللوحة، قبل النص وقبل أي إدراج.
let board = document.getElementById("board");
let tea = document.createElement("li");
console.log(tea.parentElement);
console.log(document.body.contains(tea));
console.log(board.children.length);
console.log(tea.textContent);
النواتج: null و false و 1 وسلسلة فارغة. المتصفح يملك كائن li حقيقيًا. لا أب له. ابن العناصر الوحيد ما زال milk. كلمة milk لذلك العنصر القديم، لا للجديد.
كلمة tea لا تُدرجه بعد
textContent يستبدل النص داخل العقدة التي تمسكها. ليس دالة إدراج. قائمة أبناء اللوحة لا تكبر.
let board = document.getElementById("board");
let tea = document.createElement("li");
tea.textContent = "tea";
console.log(tea.textContent);
console.log(document.body.contains(tea));
console.log(board.children.length);
النواتج: tea و false و 1. تقرأ الكلمة من الكائن. الصفحة ما زالت تعرض milk فقط. contains يساوي false لأن العقدة لم توضع تحت المستند.
append يضع الشاي آخرًا
append يضيف العقدة آخر ابن. المتغير fromAppend يحمل نتيجة النداء، وهي undefined لا عنصر li. بعد النداء يصير الأب هو اللوحة ونص آخر عنصر هو tea. الترتيب: milk ثم tea.
let board = document.getElementById("board");
let tea = document.createElement("li");
tea.textContent = "tea";
let fromAppend = board.append(tea);
console.log(fromAppend);
console.log(tea.parentElement === board);
console.log(board.lastElementChild.textContent);
console.log(board.children.length);
النواتج: undefined و true و tea و 2. لو استعملت appendChild(tea) لظهرت العقدة نفسها. هذا المقطع لا ينادي appendChild. milk ما زال أول ابن عنصر.
prepend و insertBefore يضبطان الترتيب
هذا المقطع يبدأ من اللوحة الأصلية ثم يضع ثلاث عقد. prepend يعمل بعد أن صار tea أخيرًا، فيصبح bread الابن الأول. insertBefore(eggs, milk) مرجعه milk، فيجلس eggs بين bread و milk. النصوص الأربعة: bread و eggs و milk و tea.
let board = document.getElementById("board");
let milk = document.getElementById("milk");
let tea = document.createElement("li");
tea.textContent = "tea";
board.append(tea);
let bread = document.createElement("li");
bread.textContent = "bread";
board.prepend(bread);
let eggs = document.createElement("li");
eggs.textContent = "eggs";
board.insertBefore(eggs, milk);
console.log(board.children[0].textContent);
console.log(board.children[1].textContent);
console.log(board.children[2].textContent);
console.log(board.children[3].textContent);
النواتج: bread و eggs و milk و tea. طول children يساوي 4. الفهرس 1 هو eggs لا milk. انتقل milk من الفهرس 0 إلى 2 لأن عنصرين وُضعا قبله. نص milk ما زال الكلمة milk.
عقدة النص لا تدخل children
شغّل هذا المقطع على اللوحة الجديدة، القائمة الأصلية ذات السطر الواحد، لا بعد سكربت الصفحة. createTextNode يبني عقدة نص. nodeType بقيمة 3 يعني نصًا. القيمة 1 تعني عنصرًا. children يتجاهلها فيبقى الطول 1. childNodes يحسبها فيصير الطول 2 بدل 1. آخر عنصر ما زال milk. قد ترى كلمة salt في القائمة، وهي ليست li.
let board = document.getElementById("board");
let salt = document.createTextNode("salt");
board.append(salt);
console.log(salt.nodeType);
console.log(board.children.length);
console.log(board.childNodes.length);
console.log(board.lastElementChild.id);
النواتج: 3 و 1 و 2 و milk. سلسلة تُمرَّر إلى append، مثل board.append("salt")، تصبح كذلك عقدة نص لا li. عرض الصفحة في الأسفل لا يحوي هذا السطر.
سطر تحت اللوحة
السكربت في آخر body بعد وجود القائمة. يلحق tea، ويقدّم bread، ويدرج eggs قبل milk. لا ينشئ salt. يكتب الفهرس 0 و 1 و 2 ثم عدد العناصر. لا يكتب النص الرابع، tea.
<!DOCTYPE html>
<html>
<head>
<title>create elements — page</title>
</head>
<body>
<ul id="board"><li id="milk">milk</li></ul>
<p id="line">…</p>
<script>
let board = document.getElementById("board");
let milk = document.getElementById("milk");
let tea = document.createElement("li");
tea.textContent = "tea";
board.append(tea);
let bread = document.createElement("li");
bread.textContent = "bread";
board.prepend(bread);
let eggs = document.createElement("li");
eggs.textContent = "eggs";
board.insertBefore(eggs, milk);
document.getElementById("line").textContent =
board.children[0].textContent + " / " +
board.children[1].textContent + " / " +
board.children[2].textContent + " / " +
board.children.length;
</script>
</body>
</html>
السطر يصير bread / eggs / milk / 4. القائمة نفسها: bread و eggs و milk و tea. السطر يتوقف عند العنصر الثالث ثم يعطي الطول، فلا تكون tea الرمز الأخير وليس الرمز الأخير كلمة. salt غائب. نص عنصر milk ما زال milk. الصفحة التالية عن الأحداث ولا تضيف طريقة أخرى لبناء هذه العقد.
افحص اللوحة
- أنشئ
liواقرأparentElementوdocument.body.containsوchildren.lengthوtextContent. القيم: null و false و 1 وسلسلة فارغة. - اجعل النص tea واقرأ النص و contains والطول. القيم: tea و false و 1.
- ألحق tea واقرأ نتيجة النداء، وهل الأب هو اللوحة، ونص آخر عنصر، والطول. القيم: undefined و true و tea و 2. ثم شغّل مقطع الترتيب واقرأ bread و eggs و milk و tea.
- على اللوحة الجديدة ألحق عقدة نص الملح واقرأ
nodeTypeوطولchildrenوطولchildNodesومعرّف آخر عنصر. القيم: 3 و 1 و 2 و milk. سطر الصفحة: bread / eggs / milk / 4.
زلات هذه اللوحة
القائمة ما زالت تُفتح بـ milk. النداء من نوع إدراج خاطئ.
- انتظار أن يُظهر
createElement("li")كلمة tea على اللوحة فورًا - انتظار أن يرفع
textContent = "tea"طولchildren - انتظار أن يعيد
appendعنصرli؛ ذلك ما يفعلهappendChild - تمرير سلسلة إلى
appendChild؛ السلسلة مكانهاappendوهناك تصبح عقدة نص - استدعاء
insertBeforeبمرجع ليس ابنًا للوحة - عدّ عقدة نص الملح داخل
children - بناء الصف الجديد بـ
innerHTML؛ صفحة تغيير HTML كانت تحلّل الترميز - ضبط
style.colorهنا؛ الصفحة السابقة كتبت CSS - قراءة السطر كأنه bread / eggs / milk / tea
- استدعاء
removeأوcloneNodeهنا؛ هذه الصفحة تضيف العناصر الثلاثة فقط
خذ معك هذا
createElement("li")يبني عنصرًا منفصلًا، فـparentElementهو null وطولchildrenيبقى 1textContent = "tea"يكتب الكلمة ويبقي العقدة خارج اللوحةappend(tea)يضع tea آخرًا ونتيجة النداءundefinedprepend(bread)وinsertBefore(eggs, milk)ينتجان الترتيب bread ثم eggs ثم milk ثم teacreateTextNode("salt")على اللوحة الجديدة يُبقي طولchildrenعند 1 وnodeTypeيساوي 3- السطر يصير bread / eggs / milk / 4 ونص milk يبقى milk
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى