• 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

Add and remove community directory cards

Finish the community directory by adding members through a labelled form and removing old or new cards. The starter is the completed selection-and-search step, with a form and Remove buttons in its HTML; those new controls have no handlers yet. The seed-swap demo showed the event flow using different elements.

Create DOM nodes for submitted data. Put untrusted names and skills into textContent, not innerHTML. Listen for removals on the stable #members parent, not just its initial buttons. Re-run the existing filter after any addition or removal so the count and empty state remain truthful. Filtering already clears details when it hides the selected card; removing a selected card must also clear its stale detail view. The existing View handler will also work for new cards because it listens on the same parent.

Here is a smaller example from a different project: a reading log can create a title safely and hear a Remove click from a button added later.

javascript
const entry = document.createElement("li");
const title = document.createElement("span");
title.textContent = document.querySelector("#book-title").value;
entry.append(title);
const remove = document.createElement("button");
remove.type = "button";
remove.className = "remove-book";
remove.textContent = "Remove";
entry.append(remove);
document.querySelector("#reading-log").append(entry);

document.querySelector("#reading-log").addEventListener("click", (event) => {
  if (event.target.matches("button.remove-book")) {
    event.target.closest("li").remove();
  }
});

Your directory needs this safe creation and parent-listener pattern plus buttons, selection details, form feedback, and the existing search. If a selected card disappears, clear its details rather than describing someone who is no longer there.

The starter already includes the labelled form and original Remove buttons. Its delegated View listener also works on newly created cards; leave those in place while you build the add and remove flow.

Your Task

  1. Prevent default navigation whenever #member-form is submitted.
  2. Reject a blank or whitespace-only name or skill with feedback and no new card.
  3. On valid submission, create a card with safe literal name and skill text, a View button, and a named Remove button.
  4. Announce the new member in #form-status after adding the card.
  5. Delegate Remove clicks on #members for both original and newly inserted cards.
  6. Announce the removed member in #form-status.
  7. If the removed member was selected, restore the default name and skill details.
  8. After removal, refresh the search result count and empty state for the current query.

Try adding <em>Ada</em> with the skill “Painting.” Search for painting, view the new card, remove it, then clear the search. The markup remains literal, the detail resets, and the original cards return. Your directory now supports selection, search, additions, and removal.

Take the Quiz →
Loading editor…
READY
intercourses
javascript