كائن الحدث
على جدار المتحف لوحة واحدة. الإطار الخارجي #wall. داخل اللوحة #plaque رابط، #seal، مكتوب عليه open، وhref هو /wing. تحت الجدار تقول #slip كلمة blank.
يمرّر المتصفح إلى الدالة كائنًا واحدًا. اسم الوسيط event. event.type نوع الحدث. النقرة تجعل هذا النص click. event.target هو العنصر الذي نزلت عليه النقرة. event.currentTarget هو العنصر الذي يجلس عليه هذا المستمع. يتطابقان فقط حين تكون النقرة والمستمع على عنصر واحد.
الختم رابط. preventDefault يلغي الذهاب إلى /wing. بعد النداء يصير event.defaultPrevented قيمة true. إن تركت النداء يبقى العلم false. ثم تسافر النقرة إلى الخارج: الختم، ثم اللوحة، ثم الجدار. stopPropagation على اللوحة يقطع الرحلة، فلا يعمل مستمع الجدار.
سكربت الصفحة ينقر الختم مرة. السطر تحت اللوحة: click / seal / plaque / true / quiet. هنا لا نكتب onclick، ولا نستدعي removeEventListener، ولا ننشئ عنصرًا.
الكائن الذي يمرّره المتصفح
الصفحة السابقة كانت مشجب المعاطف. دالتا wool وsilk بلا وسيط، فلم تقرآ هذا الكائن. سطرهما كان wool silk / 2 / peg. صفحة الجرس عيّنت onclick وقرأت this. هذه الصفحة لا تفعل ذلك. getElementById يعطيك الجدار واللوحة والختم والورقة فقط.
addEventListener ما زال يخزّن الدالة فقط. الكائن يصل حين تشغّل النقرة الدالة، لا حين تضيف المستمع. اقرأ currentTarget داخل الدالة. بعد عودة الدالة تصير هذه الخاصية null.
ماذا تقول نقرة واحدة
الورقة تبدأ blank. نص الرابط يبقى open. اقرأ الصفوف بالترتيب. كل مقطع يبدأ من جدار جديد، إلا صف الصفحة فهو العرض في الأسفل. ذلك العرض لا يستدعي removeEventListener.
📊 ماذا تقول نقرة واحدة
| اللحظة | ماذا تقرأ | نص الورقة | الخلط السهل |
|---|---|---|---|
مستمع على الختم، seal.click()، قراءة النوع |
event.type |
click | قراءة المعرّف كأنه النوع |
| مستمع على اللوحة، نقر الختم، قراءة target | event.target.id |
seal | قراءة currentTarget |
| نفس النقرة، قراءة currentTarget | event.currentTarget.id |
plaque | قراءة target |
preventDefault على الختم، ثم العلم |
event.defaultPrevented |
true | ظن أن الرابط ما زال يغادر |
بلا preventDefault |
event.defaultPrevented |
false | ظن أن كل مستمع يلغي الرابط |
stopPropagation على اللوحة، والجدار يسمع أيضًا |
جمع marks | plaque | توقع plaque wall |
سكربت الصفحة، click واحد |
السطر | click / seal / plaque / true / quiet | انتهاء السطر بـ wall |
نقرة على الختم كائن واحد يراه كل مستمع على الطريق. type لا يتغير. target لا يتغير. currentTarget يتغير: هو العنصر الذي يعمل مستمعه الآن.
preventDefault يخاطب الفعل الافتراضي للمتصفح. لهذا الرابط الفعل هو اتباع /wing. النداء لا يزيل مستمعًا من القائمة. stopPropagation يخاطب الرحلة. لا يلغي الرابط. نداء أحدهما ليس نداء الآخر.
join(" ") يضع مسافة بين الكلمات الموجودة أصلًا في marks. لا نجمع قائمة فارغة هنا. الورقة تبدأ بكلمة blank وتتغير فقط داخل مستمع، أو في سكربت الصفحة بعد النقرة.
النوع
المستمع على الختم. الدالة تسمّي الوسيط event وتكتب event.type في الورقة. ثم يعمل seal.click().
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
function readType(event) {
slip.textContent = event.type;
}
seal.addEventListener("click", readType);
seal.click();
console.log(slip.textContent);
الناتج click. النوع جنس الحدث، لا المعرّف ولا كلمة open.
العنصر الذي نُقر
جدار جديد. المستمع على اللوحة لا على الختم. النقرة ما زالت تنزل على الختم. event.target هو عنصر الهبوط، إذن event.target.id هو seal.
let plaque = document.getElementById("plaque");
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
function readTarget(event) {
slip.textContent = event.target.id;
}
plaque.addEventListener("click", readTarget);
seal.click();
console.log(slip.textContent);
الناتج seal. عنصر المستمع هو اللوحة. target لا يذكر اللوحة. يذكر العنصر تحت النقرة.
أين يجلس المستمع
نفس الجدار الجديد، المستمع ما زال على اللوحة، والنقرة على الختم. الورقة تكتب المعرّفين: target أولًا ثم currentTarget.
let plaque = document.getElementById("plaque");
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
function readWhere(event) {
slip.textContent = event.target.id + " " + event.currentTarget.id;
}
plaque.addEventListener("click", readWhere);
seal.click();
console.log(slip.textContent);
الناتج seal plaque. الكلمة الأولى للنقرة. الثانية للعنصر الذي يملك هذا المستمع. ضع المستمع على الختم وانقر الختم: المعرّفان كلاهما seal، لأن النقرة والمستمع عنصر واحد. هذه القراءة من اللوحة، فالمعرّفان يختلفان. اقرأ currentTarget داخل الدالة. بعد عودتها يصير null.
إلغاء الرابط
href الختم هو /wing. الفعل الافتراضي لهذه النقرة اتباع الرابط. preventDefault يلغي ذلك الفعل. لا يزيل المستمع. بعد النداء مباشرة يكون event.defaultPrevented قيمة true.
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
function hold(event) {
event.preventDefault();
slip.textContent = String(event.defaultPrevented);
}
seal.addEventListener("click", hold);
seal.click();
console.log(slip.textContent);
الناتج true. اترك preventDefault فالقراءة نفسها تصير false. تقول الورقة false ويبقى فعل الرابط قائمًا. stopPropagation لا يضع هذا العلم.
النقرة تسافر إلى الخارج
الختم داخل اللوحة، واللوحة داخل الجدار. نقرة على الختم تصل إلى مستمع اللوحة ثم مستمع الجدار، ما لم تُقطع الرحلة. stopPropagation على اللوحة يقطعها. دالة الجدار لا تعمل. preventDefault لا يقطع الرحلة.
let wall = document.getElementById("wall");
let plaque = document.getElementById("plaque");
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
let marks = [];
function onPlaque(event) {
marks.push("plaque");
event.stopPropagation();
}
function onWall() {
marks.push("wall");
}
plaque.addEventListener("click", onPlaque);
wall.addEventListener("click", onWall);
seal.click();
slip.textContent = marks.join(" ");
console.log(slip.textContent);
الناتج plaque. كلمة wall لا تنضم إلى marks. بلا stopPropagation كانت النقرة نفسها تكتب plaque wall. عرض الصفحة في الأسفل يقطع الرحلة ويلغي الرابط معًا.
سطر واحد تحت اللوحة
السكربت في آخر body، بعد وجود الجدار والفقرتين. مستمع الختم يستدعي preventDefault. مستمع اللوحة يستدعي stopPropagation ثم يحفظ النوع ومعرّف target ومعرّف currentTarget والعلم. مستمع الجدار كان سيضع heard على wall، لكن الرحلة قُطعت، فيبقى heard على quiet. يُكتب السطر بعد seal.click()، حين يكون الجدار قد أخذ فرصته.
<!DOCTYPE html>
<html>
<head>
<title>event-object — page</title>
</head>
<body>
<div id="wall">
<div id="plaque">
<a id="seal" href="/wing">open</a>
</div>
</div>
<p id="slip">blank</p>
<p id="line">…</p>
<script>
let wall = document.getElementById("wall");
let plaque = document.getElementById("plaque");
let seal = document.getElementById("seal");
let slip = document.getElementById("slip");
let kind = "";
let from = "";
let on = "";
let held = "";
let heard = "quiet";
seal.addEventListener("click", function (event) {
event.preventDefault();
});
plaque.addEventListener("click", function (event) {
event.stopPropagation();
kind = event.type;
from = event.target.id;
on = event.currentTarget.id;
held = String(event.defaultPrevented);
});
wall.addEventListener("click", function () {
heard = "wall";
});
seal.click();
slip.textContent = kind + " " + from + " " + on;
document.getElementById("line").textContent =
kind + " / " + from + " / " + on + " / " + held + " / " + heard;
</script>
</body>
</html>
السطر يصير click / seal / plaque / true / quiet. النوع click. معرّف target هو seal. معرّف currentTarget هو plaque، لأن ذلك المستمع على اللوحة. العلم true، لأن مستمع الختم استدعى preventDefault قبل أن يقرأ مستمع اللوحة العلم. الكلمة الأخيرة quiet لا wall، لأن stopPropagation عمل على اللوحة. نص open ليس في السطر. تصير الورقة click seal plaque. الصفحة التالية التفويض. الختم موجود أصلًا في الوسوم. هذه الصفحة لا تضيف ابنًا بعد المستمع.
خمسة فحوص عند اللوحة
- ضع المستمع على الختم وانقر. الورقة click.
- ضع المستمع على اللوحة، انقر الختم، واقرأ
event.target.id. الورقة seal. - نفس المستمع يكتب المعرّفين. الورقة seal plaque. مستمع على الختم نفسه يكتب seal seal.
- استدعِ
preventDefaultثم اقرأevent.defaultPrevented. الورقة true. اترك النداء فتصير الورقة false. - استدعِ
stopPropagationعلى اللوحة والجدار يسمع أيضًا. ينضم marks إلى plaque. اقرأ سطر الصفحة: click / seal / plaque / true / quiet.
أين تخدعك هذه اللوحة
الرابط ما زال يقول open. الورقة ليست نص الرابط.
- توقع أن وسيط الدالة هو عنصر الختم لا كائن الحدث
- قراءة
event.targetحين أردت العنصر الذي يجلس عليه المستمع - قراءة
event.currentTargetحين أردت العنصر تحت النقرة - توقع أن
preventDefaultيزيل المستمع، كما فعلremoveEventListenerعلى المشجب - توقع أن
stopPropagationيلغي الذهاب إلى/wing - توقع أن مستمع الجدار يعمل بعد
stopPropagationعلى اللوحة - قراءة
event.currentTargetبعد عودة الدالة وتوقع plaque - تعيين
onclickأو قراءةthisوtypeof null؛ ذلك كان صفحة الجرس - بناء الرابط بـ
createElement؛ ذلك كان صفحة أقدم - قراءة السطر كأنه ينتهي بـ wall، أو كسطر wool silk / 2 / peg
ما يبقى معك
event.typeبعد النقرة هو click- المستمع على اللوحة والنقرة على الختم:
event.target.idهو seal - في النقرة نفسها
event.currentTarget.idهو plaque - المستمع على الختم: target و currentTarget كلاهما seal
preventDefaultيجعلevent.defaultPreventedقيمة true، وتركه يبقي falsestopPropagationعلى اللوحة يمنع مستمع الجدار- سطر الصفحة: click / seal / plaque / true / quiet
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى