Is using `DOMContentLoaded` event listener the best approach here?
09:52 28 Jun 2023

I have a NavBar class that creates a navigation bar and then a function within the class that adds a click event listener to each link.

Obviously I can't add the click event listener to the element until it has rendered in the DOM and I am currently using a DOMContentLoaded event listener in the render function in order to wait before firing off the assignNavLinkHandlers function.

Is using the DOMContentLoaded event listener here best practice, or is there a more elegant/practical solution?

Below is the code which implements the above:

import { links } from "../../constants/navigationLinks.js";
import { initRouter, navigateTo } from "../../utils/router.js";

export default class NavBar {
  constructor() {
    this.navLinks = links;
  }

  assignNavLinkHandlers() {
    Object.values(this.navLinks).forEach((link) => {
      const { navLink, pageName } = link;
      const assignedLink = document.getElementById(navLink);
      assignedLink.addEventListener("click", async () => {
        pageName === "home" ? navigateTo("/") : navigateTo(`/${pageName}`);
      });
    });
  }

  startRouter() {
    initRouter();
  }

  render() {
    const navBar = document.createElement("nav");
    navBar.classList.add("navbar");

    const navList = document.createElement("ul");
    navList.classList.add("nav-list");

    for (const link in this.navLinks) {
      const navItem = document.createElement("li");
      navItem.classList.add("nav-item");

      const navLink = document.createElement("a");
      navLink.classList.add("nav-link");
      navLink.id = this.navLinks[link].navLink;
      navLink.textContent = this.navLinks[link].label;

      navItem.appendChild(navLink);
      navList.appendChild(navItem);
    }

    navBar.appendChild(navList);

    document.addEventListener("DOMContentLoaded", () => {
      this.assignNavLinkHandlers();
      this.startRouter();
    });

    return navBar;
  }
}
best-practices javascript