Home HTML Data Types DOM JavaScript JS Debugging

Following along

Remember to “git pull” on teacher repository to update to lates.

  • Run this notebook in VSCode
  • Activate Help-Toogel Developer Tools to add console outputs to runtime experience

Referencing HTML elements using javascript

  • To get an HTML element, use document.getElementById("idTag")
  • You will use the ID that you set in your HTML
  • if you console.log the resulting variable you will get some information about the element
%%html
<!-- the ID must be specified within the element -->
<h1 id="domTitleID">My Title</h1>

<!-- javascript goes here -->
<script>
var titleElement = document.getElementById("domTitleID")
<!-- outputs h1 tag -->
console.log("Example #1, show element in DOM")
console.log(titleElement)
</script>

My Title

Getting the data within the HTML element

  • The variable titleElement stores the “object”
  • Basically think of this as the group of data enclosed in HTML tag
  • To access a certain type of data from an “object” we use “.” notation
    • .innerHTML gets data within center of tag
%%html
<!-- the ID must be specified within the element -->
<h1 id="domTitleIDget">My Title</h1>

<!-- javascript goes here -->
<script>
var titleElement = document.getElementById("domTitleIDget")
<!-- outputs h1 innerHTML from h1 tag -->
console.log("Example #2, show innerHTML")
console.log(titleElement.innerHTML)
</script>

My Title

Setting the data within the HTML Element

  • The innerHTML data in this “object” can be set like a variable
    • Change the value of the innerHTML using the “=” (assignment) operator
%%html
<!-- the ID must be specified on the element -->
<h1 id="domTitleIDset">My Title</h1>

<!-- javascript goes here -->
<script>
var titleElement = document.getElementById("domTitleIDset")
titleElement.innerHTML = "Set and Update My Title"
<!-- outputs h1 innerHTML after h1 tag has been updated -->
console.log("Example #3, update innerHTML")
console.log(titleElement.innerHTML)
</script>

My Title

Creating elements

  • Create a new element with the document.createElement function -> takes in the type of element
  • Set properties in the element just like the “h1” example
%%html
<!-- the ID must be specified on the element -->
<div id="divContainerID">
    <h1 id="h1ElementID">My Title</h1>
</div>

<!-- javascript goes here -->
<script>
   // creates a new element
   var pElement = document.createElement("p")
   pElement.innerHTML = "Starting a paragraph of text."
   
   // outputs p tag after it has been created
   console.log("Example #4, create a p tag within JS")
   console.log(pElement)
</script>

My Title

Issue! How to Create element that appears in HTML?

  • Here is a visualization of what is happening => the “p” is not placed inside the HRML page! visual on p tag floating

Solution

  • Correct by placeing the element somewhere in the page
  • For example, we could add the element within the div
    • For this, use the appendChild function on the div object (the parameter would be the p element we created)
    • Remember, use the getELementById to get the object for something in the html (the div!)
  • Updated Diagram visual on p tag in div
%%html
<!-- the ID must be specified on the element -->
<div id="divContainerIDset">
    <h1 id="h1ElementIDset">My Title</h1>
</div>

<!-- javascript goes here -->
<script>
   // creates a new element
   var pElement = document.createElement("p")
   pElement.innerHTML = "Starting a paragraph of text."
   
   // outputs p tag after it has been created
   console.log("Example #5, add p tag to HTML")
   console.log(pElement)
   
   // place the p element inside the HTML page
   var div = document.getElementById("divContainerIDset")
   div.appendChild(pElement)
</script>

Functions in JavaScript, using with DOM

  • Functions allow you to “do something”
    • ex. “eat food” in a Snake Game
  • Functions were used in previous examples
    • console.log = “print something”
    • document.getElementById = “find an element with id”
  • Functions take in parameters, what to do (inside the parenthesis)
    • the parameter tells console.log what to print
    • the parameter in document.getElementById tells the id of the element
  • Functions can be used with DOM as well, thes will be shown below

Creeating functions

  • document functions functions were used to create a lot of functionality, but how can a developer create their own?
  • function are useful to avoid writing the same code over and over again
  • function can contain parameters for input (they effectively become variables)
  • function can contain a return, the are the “output” of the function
%%html
<!-- the ID must be specified on the element -->
<div id="divContainerIDfunction">
    <h1 id="h1ElementIDfunction">My Title</h1>
</div>

<!-- javascript goew here -->
<script>
    // define a function => takes parameter text, returns a new p tab
    function createPTag(text) {
        // creates a new element
        var pElement = document.createElement("p")

        // using the parameter like a variable
        pElement.innerHTML = text
        
        // outputs p tag after it has been created
        console.log("Example #6, add p tag using a function")
        console.log(pElement)

        return pElement;
    }

    // using a function to create p tag
    var pTag = createPTag("Starting a paragraph with cooler text than before.")

    // place the p element in the webpage
    var div = document.getElementById("divContainerIDfunction")
    div.appendChild(pTag)
</script>

OnClick Event

  • Run a function when an event occurs
    • In this case, the p tag is created when the button is clicked
%%html
<!-- the ID must be specified on the elements -->
<button id="buttonID">Click here!</button>

<div id="divContainerIDbutton">
    <h1 id="h1ElementIDbutton">My Title</h1>
</div>

<!-- our javascript goe here -->
<script>
    // define a function => takes parameter text, returns a new p tab
    function createPTag(text) {
        // creates a new element
        var pElement = document.createElement("p")

        // using the parameter like a variable
        pElement.innerHTML = text
        
        // outputs p tag after it has been created
        console.log("Example #7.1, add p tag using a function")
        console.log(pElement)

        return pElement;
    }

    // create a function that sets specific text and adds to div
    function addPTagOnButton() {
        // using our new function
        var pTag = createPTag("Starting a paragraph with text created on button press.")

        // place the p element in the webpage
        var div = document.getElementById("divContainerIDbutton")

        // add p tag to the div
        div.appendChild(pTag)
        
        // outputs p tag after it has been created
        console.log("Example #7.2, update container adding a 'p' tag")
        console.log(div)
    }

    // add the P tag when our button is clicked
    var myButton = document.getElementById("buttonID")
    myButton.onclick = addPTagOnButton
    
</script>

Hacks

  • Copy your HTML code from the HTML hacks. Write a Javascript snippet to switch the links of the two a tags when a button is pressed. Once they are switched, change the inner HTML of the top p tag to the word “switched!”
%%html
<html>
<head>
    <title>Page Title</title>
</head>
<body>

<h1>Geoguessr Idea</h1>
<h4>Developed by Tucker Golpariani</h4>
<p>This is a website that demos me and my Team's Passion Project for the first trimester of AP Computer Science Principles in 2023. Our idea is to display information regarding an interactable game, such as Geoguessr.</p>

<button id="switchButton">Switch Links</button>

<!-- first information -->
<div>
    <!-- notice how tags can be put INSIDE each other -->
    <p id="switchedText">
    <p>There will be interactibility between visuals that display a particular geographical location (photo). Correct answers earn points.</p>
    <p>We will display leaderboard information for people who interact with the Geoguessr-type game on the site.</p>
</div>

<!-- second information -->
<div>
    <!-- notice how tags can be put INSIDE each other -->
    <p>We plan to include other various interactions, too. For example, we may utilize a gamemode-type function to add some variation.</p>
    <p>Additionally, navigation will also be involved. Home, Leaderboard, and Game buttons/tabs will likely all be available mechanisms of our Passion Project site.</p>
</div>

<a id="link1" href="https://www.w3schools.com/html/default.asp">Visit W3Schools HTML Page; Learn How This Was Built</a>
<a id="link2" href="https://github.com/tuckergol/student2#readme">My GitHub Repository</a>

<p>The two links above should switch both their text and directories after clicking the "Switch Links" button.</p>

<script>
    document.getElementById("switchButton").addEventListener("click", function () {
        // Get the two anchor elements by their IDs
        var link1 = document.getElementById("link1");
        var link2 = document.getElementById("link2");

        // Swap their href attributes
        var tempHref = link1.href;
        link1.href = link2.href;
        link2.href = tempHref;

        // Swap their text content
        var tempText = link1.textContent;
        link1.textContent = link2.textContent;
        link2.textContent = tempText;

        // Change the inner HTML of the top <p> tag
        document.getElementById("switchedText").innerHTML = "Switched!";
    });
</script>

</body>
</html>
Page Title

Geoguessr Idea

Developed by Tucker Golpariani

This is a website that demos me and my Team's Passion Project for the first trimester of AP Computer Science Principles in 2023. Our idea is to display information regarding an interactable game, such as Geoguessr.

There will be interactibility between visuals that display a particular geographical location (photo). Correct answers earn points.

We will display leaderboard information for people who interact with the Geoguessr-type game on the site.

</div>

We plan to include other various interactions, too. For example, we may utilize a gamemode-type function to add some variation.

Additionally, navigation will also be involved. Home, Leaderboard, and Game buttons/tabs will likely all be available mechanisms of our Passion Project site.

Visit W3Schools HTML Page; Learn How This Was Built My GitHub Repository

The two links above should switch both their text and directories after clicking the "Switch Links" button.

</body> </html>