DOM Olympics Guide

Make sure you understand the DOM and methods before getting into this exercise or guide. You'll want to be familiar with at least document.getElementById()

You will be expected to write your own event listeners.

There are many properties and methods associated with the DOM, but if you think of the DOM as a tree of elements, each element with it's own properties that make it what is is (the text inside it, it's class names, id, and style properties) it starts to get easier.

Preliminaries

The first thing we want to do is create an h1, give it a class and some text and put it in the DOM.

const h1 = document.createElement("h1");

document.createElement() will create an element with the tag name of what's passed it. We'll also have a variable to call it and add properties to it.

.textContent is one of the things we can add to the h1

h1.textContent = "JavaScript made this!!";

This will give the h1 some text. We can't see it yet. It only excists in memory. We need to append it to the DOM.

document.getElementById("header").appendChild(h1);

This line selects something that exists in the DOM, and appends our h1 as the last child. In this case the only child.

It's not styled quite yet. Let's add the class header to our h1

Before we append it, let's do the following:

h1.className = "header";

Make sure that you understand those lines and that they are working before moving to the subtitle.


Attempt the subtitle by yourself. A sometimes usefull property of an element is .innerHTML. It's a bit like textContent was for the first step.

once you've created a subtitle element, you could say something like,

subTitle.innerHTML = '<span class="name">Eric</span> wrote the JavsScript`;

Make sure you append the subTitle and give it any classes it needs.

Bronze

We need to change those divs, but are only given a class to select them with. There is a method called, document.getElementsByClassName()

This will return a list of the elements. It's esenically an array.

I was to select all the divs with class message and assign the variable messages to it. Plural variable names for arrays are a must.

const messages = document.getElementsByClassName("message");

We can select the first message like messages[0] and the rest using thier respective indexes.

Change all the messages .textContent to something pleasant.

Now we can clear them. Our code from the first challenge may look like this:

const messages = document.getElementsByClassName("message");

messages[0].textContent = "you're great";
messages[1].textContent = "thanks!";
messages[2].textContent = "you're welcome";
messages[3].textContent = "you're great";

We could also loop over all the messages and clear them out.

Use either method with a button to clear out the messages.

Silver

For this one, you'll have to setup an event on that drop down.

Use the change event.

We want to edit the classList or className property to add the class theme-two or remove it.

We can use the .toggle() method to do that.

element.classList.toggle("theme-two");

If you wanted to write a for loop to add that to every message, you could use our messages variable from before and do this:

for(let i = 0; i < messages.length; i++) {
    messages[i].classList.toggle("theme-two");
}

You may have to write an if in there to see what classes are applied, or what the e.target.value is in the event listener. Especially if you add more themes.

Gold

For this, you'll need to use several of your skills you've practiced on other medals.

For every new message submission, you'll need to create a div

You'll need to get at the .value of the input box inside of an event handler.

You'll need to take that value, and assign it your newly created elements .textContent

Then give your div class names the same as the ones in the HTML

Append that to the appropriate spot in the DOM, and you're on your way to making everyone around you happy and making yourself rich.