• do
InterCourses
CoursesBlogs
0
← DOM Manipulation with JavaScript
○The page is a tree○Exercise: follow the document reference○Load a script when the page is ready○Exercise: initialize a deferred script○Find one element by id or CSS selector○Exercise: select a notice and label○Compare DOM properties, HTML attributes, and node types○Exercise: inspect a room input and its nodes✦Module Quiz
○Find every match with querySelectorAll○Exercise: label every trail stop○Move from a child to its relatives○Exercise: trace a nested card○Check for missing elements and search within a card○Exercise: update only the chosen card○Compare a live HTMLCollection with a static NodeList○Exercise: safely expand a live collection✦Module Quiz
○Safe text and HTML○Exercise: render a safe notice○Read and change link attributes○Exercise: update an accessible link○Data attributes and conditional text○Exercise: announce session availability○Boolean attributes and DOM properties○Exercise: unlock a volunteer sign-up✦Module Quiz
○Add, remove, and check classes○Exercise: mark a favourite card○Toggle a panel accessibly○Exercise: toggle the help panel○Inline styles, classes, and hidden○Exercise: style and hide a notice○Change a CSS custom property from JavaScript○Exercise: change a workshop card accent✦Module Quiz
○Create and Append a Text Node○Exercise: Add a Reading List Item○Place Nodes Before and Between○Exercise: Order the Workshop Agenda○Remove, Replace, and Clear Safely○Exercise: Refresh a Museum Display○Clone a Card and Insert a Batch○Exercise: Clone Two Exhibit Cards✦Module Quiz
○Listen for Clicks with a Named Handler○Exercise: Check Library Hours○Event Target, Current Target, and Delegation○Exercise: Delegate Pantry Actions○Keyboard Events Without Trapping Keys○Exercise: Search the Recipe Box○Once, Remove, and Bubble●Exercise: Control Workshop Notifications✦Module Quiz
○Read a field while someone types○Build a live name preview○Handle submit without leaving the page○Validate a library request○Keep a selection in sync on change and reset○Sync a preference and its reset state○Read multiple checked values with FormData○Build a checkbox-based garden request✦Module Quiz
○Filter a list as someone types○Build a live trail finder○Toggle an accessible disclosure○Build a guide menu disclosure○Create and remove items with one delegated listener○Build a neighborhood task board○Sort a workshop table with accessible buttons○Build an accessible sortable resource table✦Module Quiz
○Read selectable cards and detail updates○Build directory cards and a selected profile○Trace live search and an empty state○Add live search to the community directory○Trace safe additions and delegated removal○Add and remove community directory cards✦Module Quiz
○Read and update a live itinerary○Build the workshop itinerary○Add a validated item through a form○Add a workshop session○Filter and remove live entries○Finish the workshop planner✦Module Quiz
○Fetch JSON and render safe text○Exercise: load recipe cards○Handle loading, empty, and failed responses○Exercise: handle alert states○Build a query with URLSearchParams○Exercise: search the catalog○Abort outdated requests○Exercise: keep the latest result✦Module Quiz
○Load a dashboard from an offline API fixture○Build an events dashboard○Query a dashboard with URLSearchParams○Add event search to the dashboard○Retry requests without stale results○Finish a resilient event dashboard✦Module Quiz

Exercise: Control Workshop Notifications

A workshop has a one-time welcome, a bell that can be muted, and a control panel with standard and private actions. Give each control the precise click behavior it needs.

How it works

The museum demo used a named ring callback for removal; here is a different bus-stop example showing the same lifecycle. The named function passed to removal must be the exact function originally registered. For nested controls, clicks travel from the button to its panel unless that button explicitly stops propagation. Do not stop propagation on the panel itself or on every button, and keep the provided native buttons instead of adding keyboard handlers to noninteractive elements.

javascript
// Different example: a bus-stop notice, not the workshop.
notice.addEventListener("click", announce, { once: true });
alarm.addEventListener("click", soundAlarm);
mute.addEventListener("click", () => alarm.removeEventListener("click", soundAlarm));
privateButton.addEventListener("click", event => event.stopPropagation());

Try the preview

Run the preview: Welcome increments only once. Bell increments until Muting stops it. Standard writes Standard Panel, but Private writes Private without Panel. Try Tab and Enter on the buttons to confirm native activation is still intact.

Remember

The earlier event-target lesson used bubbling to receive a child click on a parent. This exercise lets one private child stop that route while leaving standard clicks free to bubble.

Your Task

  1. Add a click listener to #welcome with { once: true } so #welcome-count changes from Welcomes: 0 to Welcomes: 1 on the first click and never counts higher.
  2. Register a named Bell click handler that increments #bell-count on each click.
  3. Clicking #mute must remove that same Bell handler so later Bell clicks no longer increment the count.
  4. Let #standard clicks write Standard Panel to #actions by bubbling to #controls.
  5. Make #private write Private without adding Panel by stopping only that child click’s propagation.
Hint 1
1 / 1
HINT 1

Use the same function name when adding and removing the Bell listener. Stop propagation only on Private.

Take the Quiz →
Loading editor…
READY
intercourses
javascript