شنودگر رویداد
توی رختکن یک چوبلباسی است. دکمه #peg است و رویش نوشته hang. زیرش بند #ticket هنوز میگوید blank.
صفحهٔ قبل زنگ در بود و ویژگی onclick. آنجا یک جا بیشتر نبود. تابع دوم که میآمد، اولی میرفت. اینجا آن ویژگی را نمینویسیم. typeof و this هم مال همان صفحه است.
حرف این صفحه addEventListener است. تابع را به فهرست کلیک دکمه اضافه میکند. همان خط اجرا نمیشود. تا peg.click() نزنی، بلیت همان blank میماند.
wool را بگذار، بعد silk را. دومی اولی را کنار نمیزند. یک کلیک هر دو را صدا میزند. اول wool، بعد silk. بلیت میشود wool silk. نوشتهٔ روی دکمه همان hang است.
همان تابع wool را اگر دو بار بدهی، بار دوم چیزی اضافه نمیکند. یک کلیک، یک بار.
removeEventListener فقط همان تابعی را برمیدارد که خودت گذاشتی. یک تابع تازه، حتی اگر خطهایش عین wool باشد، شیء دیگری است. wool سر جایش میماند.
اسکریپت پایین هر دو را میگذارد و یک بار کلیک میزند. خط زیر چوبلباسی این است: wool silk / 2 / peg. اینجا عنصر نمیسازی، استایل نمینویسی، و آرگومان رویداد را هم نمیخوانی. آن مال صفحهٔ بعد است.
دو قلاب، نه یک جا
getElementById فقط دکمه و بند بلیت را به دستت میدهد. هر بار addEventListener میتواند یک شنوندهٔ دیگر کنار قبلی بنشیند. کلیک، فهرست را از اول به آخر اجرا میکند. این تابعها پارامتری نمیگیرند. شیء رویداد صفحهٔ بعد است.
کی گوش میدهد
دکمه با hang شروع میشود و زیرش blank است. ردیفها را به ترتیب بخوان. هر قطعه از دکمهٔ تازه شروع میشود، جز ردیف صفحه که مال نمایش پایین است. آن نمایش کسی را برنمیدارد.
📊 کی گوش میدهد
| لحظه | کی گوش میدهد | متن بلیت | لغزش رایج |
|---|---|---|---|
click و هنوز شنوندهای نیست |
هیچکس | blank | خیال اینکه کلیک خالی wool مینویسد |
addEventListener برای wool، پیش از click |
wool | blank | خیال اینکه خودِ اضافه کردن wool مینویسد |
click فقط با wool |
wool | wool | عوض شدن متن دکمه به wool |
اول wool بعد silk، یک click |
هر دو، اول wool بعد silk | wool silk | اجرای فقط دومی |
removeEventListener برای wool، بعد click |
silk | silk | اجرای هر دو |
اسکریپت صفحه، یک click |
هر دو | wool silk | تمام شدن خط با hang |
addEventListener("click", wool) نام wool را ته فهرست کلیک میگذارد. صدایش نمیزند. peg.click() کلیک را میفرستد و فهرست را از سر اجرا میکند. متن خود دکمه عوض نمیشود.
silk را که بعداً اضافه کنی، پشت wool مینشیند. هر دو اجرا میشوند. ترتیب همان ترتیب اضافه کردن است.
شیء تابع را دو بار اضافه نمیکنی. peg.addEventListener("click", wool) و دوباره همان خط، فهرست را یکی نگه میدارد. یک کلیک، wool یک بار. parts.length میشود ۱ و بلیت wool است.
removeEventListener("click", wool) همان شیء را برمیدارد. اگر silk را گذاشته باشی، silk میماند. تابع نویی که بدنش هم "wool" را push کند، جور نیست. بعد از peg.removeEventListener("click", function () { parts.push("wool"); }) خود wool هنوز در فهرست است. کلیک باز wool مینویسد.
join(" ") فقط بین واژههایی که الان در parts هستند فاصله میگذارد. فهرست خالی را اینجا به هم نمیچسبانیم. بلیت از واژهٔ blank شروع میشود و فقط داخل شنونده عوض میشود.
هنوز کسی گوش نمیدهد
فایل با دکمه و بند باز میشود. شنوندهای اضافه نشده. کلیک میرود و این دو خروجی سراغ بلیت و نوشتهٔ روی دکمه میروند.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
peg.click();
console.log(ticket.textContent);
console.log(peg.textContent);
خروجیها: blank و hang. فهرست کلیک خالی بود. بند عوض نشد.
شنونده منتظر میماند
addEventListener تابع wool را نگه میدارد. بدنه همان خط اجرا نمیشود. parts خالی میماند، بلیت blank است، و دکمه هنوز hang میگوید.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
خروجیها: blank، 0، و hang. wool در فهرست است. کسی صدایش نزده، پس واژهای در parts نیست.
click هر که در فهرست است را اجرا میکند
این قطعه دوباره از دکمهٔ تازه شروع میشود. فقط wool اضافه میشود، بعد peg.click(). بلیت میشود wool. متن دکمه hang میماند. parts.length برابر ۱ است.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.click();
console.log(ticket.textContent);
console.log(peg.textContent);
console.log(parts.length);
خروجیها: wool، hang، و 1. یک شنونده، یک واژه. hang هنوز مال دکمه است.
silk کنار wool مینشیند
دکمهٔ تازه. اول wool، بعد silk، و تازه آنوقت یک click. بین دو اضافه کردن کلیکی نیست. wool واژهٔ "wool" را میگذارد و مینویسد. silk واژهٔ "silk" را میگذارد و هر دو را با فاصله مینویسد. بلیت wool silk است. parts.length برابر ۲ است. دکمه hang میماند.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.click();
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
خروجیها: wool silk، 2، و hang. silk جای wool را نگرفت. یک کلیک فهرست را به ترتیب اضافه شدن اجرا کرد.
wool را از چوبلباسی بردار
دکمهٔ تازه. هر دو تابع اضافه میشوند. بعد removeEventListener با همان تابع wool صدا زده میشود. silk میماند. یک click فقط silk را اجرا میکند. بلیت silk است، نه wool silk. parts.length برابر ۱ است.
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
function wool() {
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.removeEventListener("click", wool);
peg.click();
console.log(ticket.textContent);
console.log(parts.length);
console.log(peg.textContent);
خروجیها: silk، 1، و hang. wool همان شیئی بود که اضافه کرده بودی، برای همین از فهرست رفت. نمایش پایین کسی را برنمیدارد.
یک خط زیر چوبلباسی
اسکریپت ته body است، بعد از اینکه دکمه و بندها ساخته شدهاند. اول wool را میگذارد، بعد silk را، بعد یک بار click. هر تابع یکی به hits اضافه میکند و واژهٔ خودش را push میکند. خط، متن بلیت و تعداد و peg.id را به هم میچسباند. متن دکمه را نمینویسد. آرگومان رویداد هم نمیخواند.
<!DOCTYPE html>
<html>
<head>
<title>event-listeners — page</title>
</head>
<body>
<button id="peg" type="button">hang</button>
<p id="ticket">blank</p>
<p id="line">…</p>
<script>
let peg = document.getElementById("peg");
let ticket = document.getElementById("ticket");
let parts = [];
let hits = 0;
function wool() {
hits = hits + 1;
parts.push("wool");
ticket.textContent = parts.join(" ");
}
function silk() {
hits = hits + 1;
parts.push("silk");
ticket.textContent = parts.join(" ");
}
peg.addEventListener("click", wool);
peg.addEventListener("click", silk);
peg.click();
document.getElementById("line").textContent =
ticket.textContent + " / " + hits + " / " + peg.id;
</script>
</body>
</html>
خط این است: wool silk / 2 / peg. بلیت wool silk است، نه blank. شمارش ۲ است، چون هر دو شنونده روی همان یک کلیک اجرا شدند. واژهٔ آخر شناسهٔ دکمه است، peg.id، نه واژهٔ hang. روی دکمه هنوز hang نوشته. صفحهٔ بعد شیء رویداد است. همان آرگومانی را میخواند که این تابعها نگرفتهاند.
پنج بار چک کن
- بدون شنونده کلیک کن. بلیت blank است و دکمه hang.
- wool را اضافه کن و کلیک نکن. بلیت blank است،
parts.lengthبرابر ۰ است، دکمه hang است. - wool را اضافه کن و کلیک کن. بلیت wool است، دکمه hang است،
parts.lengthبرابر ۱ است. - wool و بعد silk را اضافه کن و یک بار کلیک کن. بلیت wool silk است،
parts.lengthبرابر ۲ است، دکمه hang است. - هر دو را اضافه کن، wool را بردار، بعد کلیک کن. بلیت silk است،
parts.lengthبرابر ۱ است، دکمه hang است. خط صفحه را بخوان: wool silk / 2 / peg.
کجای این چوبلباسی گول میزند
روی دکمه هنوز hang است. فهرست یا هر دو تابع را داشت، یا فقط silk را، یا هیچکس را.
- انتظار اینکه
addEventListenerدوم جای اولی را بگیرد، همانطور کهonclickمیگرفت - انتظار اینکه خود
addEventListenerبلیت را wool کند - انتظار اینکه با بودن هر دو، فقط silk اجرا شود
- انتظار اینکه متن دکمه wool شود
- انتظار اینکه
removeEventListenerبا یک تابع تازه، wool را بردارد - دو بار دادن همان تابع
woolو انتظار دو بار اجرا - خواندن
onclickیاtypeof nullیاthis.idاینجا؛ آن مال صفحهٔ زنگ بود - خواندن
event.targetاینجا؛ این تابعها آرگومان نمیگیرند و شیء رویداد صفحهٔ بعد است - ساختن دکمه با
createElement؛ آن مال صفحهٔ قبلیتر بود - خواندن خط به شکل blank / 0 / hang
چه چیز میماند
- بدون شنونده،
peg.click()بلیت را blank میگذارد و دکمه hang میماند addEventListenerتا پیش ازclickبلیت را blank نگه میدارد- یک کلیک فقط با wool بلیت را wool میکند و دکمه hang میماند
- اول wool بعد silk، بعد یک کلیک، بلیت را wool silk میکند
removeEventListenerبا همان wool، بعد کلیک، بلیت را silk میکند- همان wool اگر دو بار اضافه شود یک بار اجرا میشود، و تابع تازه برش نمیدارد
- خط صفحه میشود wool silk / 2 / peg
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود