Learn JavaScript: Complete Guide for Beginners

Okay, here’s a comprehensive article (approximately 5000 words) detailing a “Learn JavaScript: Complete Guide for Beginners” course, structured as if describing a real, detailed curriculum. This will cover not just the topics but also the why behind them, common pitfalls, and best practices, presented in a way suitable for someone completely new to programming.

Learn JavaScript: Complete Guide for Beginners

Introduction: Welcome to the World of JavaScript!

This course is designed to take you from zero programming knowledge to a comfortable level of understanding and proficiency in JavaScript. JavaScript is the language of the web, powering interactive websites, web applications, and even extending into areas like server-side development (Node.js), mobile apps (React Native), and desktop applications (Electron). This guide isn’t just about memorizing syntax; it’s about understanding the why behind the code, building a solid foundation, and developing the problem-solving skills necessary to become a successful JavaScript developer.

We’ll proceed step-by-step, starting with the absolute basics and gradually building up to more complex concepts. Each section will include explanations, examples, exercises, and common pitfalls to avoid. The goal is to make learning engaging and effective, empowering you to create your own interactive web experiences.

Course Structure:

The course is divided into several modules, each building upon the previous one. Here’s a high-level overview:

  1. Getting Started: Setting Up Your Environment
  2. Fundamentals: Variables, Data Types, and Operators
  3. Control Flow: Making Decisions with Code
  4. Functions: Reusable Blocks of Code
  5. Data Structures: Arrays and Objects
  6. Working with the DOM: Manipulating Web Pages
  7. Events: Responding to User Interaction
  8. Asynchronous JavaScript: Understanding Callbacks, Promises, and Async/Await
  9. Object-Oriented Programming (OOP) in JavaScript
  10. Error Handling and Debugging
  11. Modern JavaScript (ES6+ Features)
  12. Introduction to Libraries and Frameworks (Brief Overview)
  13. Building Projects: Putting It All Together

Let’s dive into each module in detail:

Module 1: Getting Started: Setting Up Your Environment

  • What is JavaScript?

    • A scripting language primarily used to add interactivity to websites.
    • Runs in web browsers (client-side) and increasingly in other environments (server-side, etc.).
    • Interpreted language (no need for separate compilation).
    • Dynamic and weakly typed (we’ll explain this later).
  • Tools of the Trade:

    • Text Editor: You’ll need a text editor to write your code. Excellent choices include:
      • VS Code (Visual Studio Code): Highly recommended! Free, open-source, and packed with features. We’ll assume you’re using VS Code for this course.
      • Sublime Text: Another popular, powerful editor.
      • Atom: A hackable text editor from GitHub.
    • Web Browser: You’ll use a web browser to run and test your JavaScript code. Popular choices include:
      • Google Chrome: Excellent developer tools.
      • Mozilla Firefox: Another great option with strong developer tools.
      • Safari: The default browser on macOS.
      • Microsoft Edge: Based on Chromium (same engine as Chrome).
    • Developer Tools (Browser): Crucial for debugging and inspecting your code. Accessed by:
      • Chrome/Edge: Right-click on a webpage -> “Inspect” or press F12 (Windows) or Cmd + Option + I (Mac).
      • Firefox: Right-click -> “Inspect Element” or press F12 (Windows) or Cmd + Option + I (Mac).
      • Safari: Enable the “Develop” menu in Safari’s preferences, then use Cmd + Option + C.
  • Your First JavaScript Program: “Hello, World!”

    • Creating an HTML file: Create a file named index.html with the following content:

      html
      <!DOCTYPE html>
      <html>
      <head>
      <title>My First JavaScript Page</title>
      </head>
      <body>
      <h1>Hello, World!</h1>
      <script>
      console.log("Hello, World! from JavaScript");
      </script>
      </body>
      </html>

    • Explanation:

      • <!DOCTYPE html>: Tells the browser this is an HTML5 document.
      • <html>: The root element of the HTML page.
      • <head>: Contains meta-information about the page (title, links to stylesheets, etc.).
      • <body>: Contains the visible content of the page.
      • <h1>: A heading element.
      • <script>: This tag is where you embed JavaScript code.
      • console.log(): A JavaScript function that prints output to the browser’s developer console. This is your primary tool for seeing what your code is doing during development.
    • Running the Code: Open index.html in your web browser. Open the developer tools (console tab) and you should see “Hello, World! from JavaScript” printed there.

  • External JavaScript Files:

    • For larger projects, it’s best to keep your JavaScript code in separate files.
    • Create a file named script.js in the same directory as index.html.
    • Move the JavaScript code from the <script> tag into script.js:

      javascript
      // script.js
      console.log("Hello, World! from JavaScript");

    • Modify index.html to link to the external file:

      html
      <!DOCTYPE html>
      <html>
      <head>
      <title>My First JavaScript Page</title>
      </head>
      <body>
      <h1>Hello, World!</h1>
      <script src="script.js"></script>
      </body>
      </html>

    • src attribute: Specifies the path to the JavaScript file.

  • Comments:

    • Comments are notes in your code that are ignored by the JavaScript interpreter. They’re essential for explaining your code to yourself and others.
    • Single-line comments: Start with //.
    • Multi-line comments: Start with /* and end with */.

      “`javascript
      // This is a single-line comment.

      /
      This is a
      multi-line comment.
      /
      “`

Module 2: Fundamentals: Variables, Data Types, and Operators

  • Variables: Storing Information

    • Variables are like containers that hold data. You give them names and can change their contents.
    • Declaration: Use let, const, or (less commonly now) var to declare a variable.

      • let: Used for variables whose values might change.
      • const: Used for variables whose values should not change (constants).
      • var: The older way to declare variables. Avoid using var in modern JavaScript due to its scoping quirks (explained later).
    • Assignment: Use the = operator to assign a value to a variable.

      javascript
      let myName = "Alice"; // Declare a variable named myName and assign the string "Alice" to it.
      const age = 30; // Declare a constant named age and assign the number 30 to it.
      let score; // Declare a variable without assigning a value (it will be undefined).
      score = 100; // Assign a value later.

    • Naming Rules:

      • Must start with a letter, underscore (_), or dollar sign ($).
      • Can contain letters, numbers, underscores, and dollar signs.
      • Case-sensitive (myName is different from MyName).
      • Use descriptive names (e.g., userScore instead of x).
      • Use camelCase for multi-word variable names (e.g., firstName, lastName).
  • Data Types:

    • JavaScript has several fundamental data types:

      • String: Represents text. Enclosed in single quotes (') or double quotes (").

        javascript
        let greeting = "Hello";
        let message = 'Welcome to my website!';

      • Number: Represents numerical values (integers and floating-point numbers).

        javascript
        let count = 10;
        let price = 9.99;

      • Boolean: Represents a truth value (true or false).

        javascript
        let isLoggedIn = true;
        let isGameOver = false;

      • Null: Represents the intentional absence of a value.

        javascript
        let myVariable = null; // Explicitly set to have no value.

      • Undefined: Represents a variable that has been declared but not assigned a value.

        javascript
        let myVariable; // myVariable is undefined.

      • Symbol: A unique and immutable primitive value (used less frequently in beginner code).

      • BigInt: Represents whole numbers bigger than the regular Number data.

        javascript
        const bigInt = 1234567890123456789012345678901234567890n;

      • Object: (Covered in more detail later) A collection of key-value pairs.

        javascript
        let person = {
        firstName: "John",
        lastName: "Doe",
        age: 30
        };

    • typeof operator: Used to determine the data type of a variable.

      “`javascript
      let myName = “Alice”;
      console.log(typeof myName); // Output: “string”

      let age = 30;
      console.log(typeof age); // Output: “number”

      let isLoggedIn = true;
      console.log(typeof isLoggedIn); // Output: “boolean”
      “`

  • Operators:

    • Arithmetic Operators: Perform mathematical calculations.

      • + (addition)
      • - (subtraction)
      • * (multiplication)
      • / (division)
      • % (modulo – remainder of division)
      • ** (exponentiation)

      javascript
      let x = 10;
      let y = 5;
      let sum = x + y; // 15
      let difference = x - y; // 5
      let product = x * y; // 50
      let quotient = x / y; // 2
      let remainder = x % y; // 0
      let power = x ** y; // 100000

    • Assignment Operators: Assign values to variables.

      • = (basic assignment)
      • += (add and assign)
      • -= (subtract and assign)
      • *= (multiply and assign)
      • /= (divide and assign)
      • %= (modulo and assign)
      • **= (exponentiate and assign)

      javascript
      let count = 10;
      count += 5; // Equivalent to count = count + 5; (count is now 15)

    • Comparison Operators: Compare values and return a boolean (true or false).

      • == (equal to – loose equality, checks only value)
      • === (equal to – strict equality, checks both value and type)
      • != (not equal to – loose inequality)
      • !== (not equal to – strict inequality)
      • > (greater than)
      • < (less than)
      • >= (greater than or equal to)
      • <= (less than or equal to)

      “`javascript
      let x = 10;
      let y = “10”;

      console.log(x == y); // Output: true (loose equality – values are the same)
      console.log(x === y); // Output: false (strict equality – types are different)
      console.log(x != y); // Output: false
      console.log(x !== y); // Output: true
      ``
      **Important:** Always use strict equality (
      ===and!==`) unless you have a very specific reason to use loose equality. Strict equality is more predictable and less prone to errors.

    • Logical Operators: Combine or modify boolean expressions.

      • && (logical AND – true if both operands are true)
      • || (logical OR – true if at least one operand is true)
      • ! (logical NOT – reverses the truth value)

      “`javascript
      let isLoggedIn = true;
      let hasPremiumAccount = false;

      if (isLoggedIn && hasPremiumAccount) {
      console.log(“Welcome, premium user!”);
      } else if (isLoggedIn) {
      console.log(“Welcome, user!”);
      } else {
      console.log(“Please log in.”);
      }
      “`

    • String Concatenation:

      • The + operator can also be used to join strings together.

      javascript
      let firstName = "John";
      let lastName = "Doe";
      let fullName = firstName + " " + lastName; // "John Doe"

    • Template Literals (Template Strings):

      • A more modern and convenient way to create strings, especially when including variables.
      • Use backticks (`) instead of single or double quotes.
      • Embed variables directly using ${variableName}.

      javascript
      let name = "Alice";
      let age = 30;
      let greeting = `Hello, my name is ${name} and I am ${age} years old.`;
      console.log(greeting); // Output: Hello, my name is Alice and I am 30 years old.

      Template literals are much cleaner and easier to read than string concatenation, especially for longer strings.

Module 3: Control Flow: Making Decisions with Code

  • Conditional Statements:

    • Control flow statements allow your code to execute different blocks of code based on conditions.
    • if statement: Executes a block of code if a condition is true.

      “`javascript
      let age = 18;

      if (age >= 18) {
      console.log(“You are an adult.”);
      }
      “`

    • else statement: Executes a block of code if the if condition is false.

      “`javascript
      let age = 16;

      if (age >= 18) {
      console.log(“You are an adult.”);
      } else {
      console.log(“You are a minor.”);
      }
      “`

    • else if statement: Allows you to check multiple conditions.

      “`javascript
      let score = 85;

      if (score >= 90) {
      console.log(“A”);
      } else if (score >= 80) {
      console.log(“B”);
      } else if (score >= 70) {
      console.log(“C”);
      } else if (score >= 60) {
      console.log(“D”);
      } else {
      console.log(“F”);
      }
      “`

    • Ternary Operator: A shorthand for a simple if-else statement.

      javascript
      let age = 20;
      let message = (age >= 18) ? "You are an adult." : "You are a minor.";
      console.log(message);

      condition ? expressionIfTrue : expressionIfFalse

  • Loops:

    • Loops allow you to repeat a block of code multiple times.
    • for loop: Executes a block of code a specific number of times.

      javascript
      for (let i = 0; i < 5; i++) {
      console.log(i); // Output: 0, 1, 2, 3, 4
      }

      * let i = 0;: Initialization (executed once at the beginning).
      * i < 5;: Condition (checked before each iteration).
      * i++: Increment (executed after each iteration).

    • while loop: Executes a block of code as long as a condition is true.

      javascript
      let count = 0;
      while (count < 5) {
      console.log(count); // Output: 0, 1, 2, 3, 4
      count++;
      }

    • do...while loop: Similar to while, but the code block is executed at least once, even if the condition is initially false.

      javascript
      let count = 5;
      do {
      console.log(count); // Output: 5
      count++;
      } while (count < 5);

    • break statement: Exits a loop prematurely.

    • continue statement: Skips the current iteration of a loop and proceeds to the next.

      “`javascript
      for (let i = 0; i < 10; i++) {
      if (i === 5) {
      break; // Exit the loop when i is 5
      }
      console.log(i); // Output: 0, 1, 2, 3, 4
      }

      for (let i = 0; i < 10; i++) {
      if (i % 2 === 0) {
      continue; // Skip even numbers
      }
      console.log(i); // Output: 1, 3, 5, 7, 9
      }
      “`

  • switch statement:

    • The switch statement is used to perform different actions based on different conditions.

    “`javascript
    let day = “Monday”;

    switch (day) {
    case "Monday":
        console.log("It's the start of the week.");
        break;
    case "Friday":
        console.log("It's almost the weekend!");
        break;
    default:
        console.log("It's a regular day.");
    }
    

    ``
    * The
    switchexpression is evaluated once.
    * The value of the expression is compared with the values of each
    case.
    * If there is a match, the associated block of code is executed.
    * The
    breakkeyword breaks out of the switch block. This will stop the execution of more code and case testing inside the block.
    * The
    default` keyword specifies some code to run if there is no case match.
    Module 4: Functions: Reusable Blocks of Code

  • What are Functions?

    • Functions are blocks of code that perform a specific task. They help you organize your code, make it reusable, and improve readability.
    • Defining a Function: Use the function keyword, followed by the function name, parentheses (), and curly braces {} to enclose the code.

      javascript
      function greet() {
      console.log("Hello!");
      }

    • Calling a Function: Execute a function by using its name followed by parentheses.

      javascript
      greet(); // Output: Hello!

  • Parameters and Arguments:

    • Functions can accept input values (parameters) that are used within the function.
    • When you call a function, you pass in the actual values (arguments).

      “`javascript
      function greet(name) { // name is a parameter
      console.log(“Hello, ” + name + “!”);
      }

      greet(“Alice”); // “Alice” is an argument. Output: Hello, Alice!
      greet(“Bob”); // “Bob” is an argument. Output: Hello, Bob!
      “`

  • Return Values:

    • Functions can return a value using the return keyword. The return statement also exits the function.

      “`javascript
      function add(x, y) {
      return x + y;
      }

      let sum = add(5, 3); // sum will be 8
      console.log(sum); // Output: 8
      “`
      * Function Expressions:
      * Functions can also be defined as expressions, assigned to a variable.

    ``javascript
    const greet = function(name){
    console.log(
    Hello, ${name}`);
    }

    greet(“Carol”); //Output: Hello, Carol
    “`
    * Arrow Functions (ES6):
    * A more concise syntax for writing function expressions.

    ```javascript
    // Regular function expression
    const add = function(x, y) {
        return x + y;
    };
    
    // Arrow function equivalent
    const addArrow = (x, y) => x + y; // Implicit return if it's a single expression
    
      //Arrow function with one argument
    const square = x => x*x;
    ```
    
    • Benefits of arrow functions:
      • More concise syntax.
      • this keyword behaves differently (covered in the OOP section).
  • Scope:

    • Scope determines the accessibility of variables.
    • Global Scope: Variables declared outside of any function have global scope and are accessible from anywhere in your code.
    • Local Scope (Function Scope): Variables declared inside a function have local scope and are only accessible within that function.
    • Block Scope (ES6): Variables declared with let and const inside a block (within curly brackets, like an if statement or a loop) are only available inside that block.

      “`javascript
      let globalVariable = “I’m global”; // Global scope

      function myFunction() {
      let localVariable = “I’m local”; // Local scope (function scope)
      console.log(globalVariable); // Accessible
      console.log(localVariable); // Accessible
      if(true){
      let blockVariable = “I am only available here”; //Block Scope
      }
      console.log(blockVariable); // Not accessible, throws error
      }

      myFunction();
      console.log(globalVariable); // Accessible
      console.log(localVariable); // Not accessible – throws an error
      “`

    • Lexical Scoping: Javascript uses lexical scoping, which means that the scope of a variable is determined by its position in the source code.

  • Immediately Invoked Function Expressions (IIFEs):

    • Functions that are executed immediately after they are defined.
    • Used to create a private scope and avoid polluting the global scope.

      “`javascript
      (function() {
      let message = “Hello from IIFE!”;
      console.log(message); // Output: Hello from IIFE!
      })(); // The parentheses at the end immediately call the function.

      // message is not accessible outside the IIFE.
      “`

Module 5: Data Structures: Arrays and Objects

  • Arrays: Ordered Lists of Data

    • Arrays are used to store multiple values in a single variable. The values are ordered and accessed by their index (starting from 0).

      “`javascript
      let fruits = [“apple”, “banana”, “orange”]; // An array of strings
      let numbers = [1, 2, 3, 4, 5]; // An array of numbers

      console.log(fruits[0]); // Output: “apple” (accessing the first element)
      console.log(fruits[1]); // Output: “banana” (accessing the second element)
      console.log(fruits.length); // Output: 3 (getting the length of the array)
      “`

    • Array Methods: Arrays have many built-in methods for manipulating their contents:

      • push(): Adds an element to the end of the array.
      • pop(): Removes the last element from the array.
      • shift(): Removes the first element from the array.
      • unshift(): Adds an element to the beginning of the array.
      • splice(): Adds or removes elements at a specific index.
      • slice(): Creates a new array containing a portion of the original array.
      • indexOf(): Returns the index of the first occurrence of an element.
      • includes(): Checks if array includes a value.
      • forEach(): Executes a function for each element in the array.
      • map(): Creates a new array by applying a function to each element.
      • filter(): Creates a new array containing only elements that pass a test.
      • reduce(): Applies a function to reduce the array to a single value.

      “`javascript
      let fruits = [“apple”, “banana”];

      fruits.push(“orange”); // fruits is now [“apple”, “banana”, “orange”]
      let lastFruit = fruits.pop(); // lastFruit is “orange”, fruits is now [“apple”, “banana”]
      fruits.forEach(function(fruit) {
      console.log(“I like ” + fruit);
      });

      let numbers = [1, 2, 3];
      let squaredNumbers = numbers.map(function(number) {
      return number * number;
      }); // squaredNumbers is now [1, 4, 9]

      let evenNumbers = numbers.filter( function(number){
      return number % 2 === 0;
      }); //evenNumbers is now [2]
      “`

  • Objects: Collections of Key-Value Pairs

    • Objects are used to store collections of data in a more structured way. They consist of key-value pairs, where each key is a string (or Symbol) and each value can be any data type (including other objects or arrays).

      javascript
      let person = {
      firstName: "John",
      lastName: "Doe",
      age: 30,
      hobbies: ["reading", "hiking", "coding"],
      address: {
      street: "123 Main St",
      city: "Anytown",
      state: "CA"
      }
      };

    • Accessing Object Properties:

      • Dot notation: object.property

        javascript
        console.log(person.firstName); // Output: "John"
        console.log(person.address.city); // Output: "Anytown"

      • Bracket notation: object["property"] (Useful when the property name is stored in a variable or contains spaces or special characters).

        javascript
        console.log(person["lastName"]); // Output: "Doe"
        let propertyName = "age";
        console.log(person[propertyName]); // Output: 30

    • Adding and Modifying Properties:

      javascript
      person.email = "[email protected]"; // Add a new property
      person.age = 31; // Modify an existing property

    • Deleting Properties:

      javascript
      delete person.hobbies; // Remove the hobbies property

    • Object Methods:

      • Objects can also contain functions (methods).

      “`javascript
      let person = {
      firstName: “John”,
      lastName: “Doe”,
      fullName: function() {
      return this.firstName + ” ” + this.lastName;
      }
      };

      console.log(person.fullName()); // Output: “John Doe”
      ``
      *
      this` keyword: Refers to the object itself within the method.

Module 6: Working with the DOM: Manipulating Web Pages

  • What is the DOM?

    • The Document Object Model (DOM) is a programming interface for HTML and XML documents. It represents the page as a tree of nodes, where each node corresponds to an element, attribute, or text content.
    • JavaScript can interact with the DOM to dynamically change the content, structure, and style of a web page.
  • Accessing Elements:

    • document.getElementById(): Gets an element by its unique id attribute.

      html
      <h1 id="myHeading">Hello, DOM!</h1>

      javascript
      let heading = document.getElementById("myHeading");
      console.log(heading); // Output: the <h1> element

    • document.querySelector(): Gets the first element that matches a CSS selector.

      html
      <p class="paragraph">This is a paragraph.</p>
      <p class="paragraph">This is another paragraph.</p>

      javascript
      let firstParagraph = document.querySelector(".paragraph"); // Selects the first <p> with class "paragraph"
      console.log(firstParagraph);

    • document.querySelectorAll(): Gets all elements that match a CSS selector (returns a NodeList, which is array-like).

      javascript
      let allParagraphs = document.querySelectorAll(".paragraph"); // Selects all <p> elements with class "paragraph"
      console.log(allParagraphs); // Output: a NodeList containing both <p> elements
      allParagraphs.forEach(function(paragraph) {
      console.log(paragraph);
      });

    • document.getElementsByClassName(): Gets all elements with a specific class name (returns an HTMLCollection, which is array-like).

    • document.getElementsByTagName(): Gets all elements with a specific tag name (returns an HTMLCollection).
  • Modifying Elements:

    • textContent: Gets or sets the text content of an element.

      javascript
      let heading = document.getElementById("myHeading");
      heading.textContent = "New Heading Text"; // Changes the text content of the <h1>

    • innerHTML: Gets or sets the HTML content of an element.

      javascript
      let paragraph = document.querySelector(".paragraph");
      paragraph.innerHTML = "<strong>This text is now bold.</strong>"; // Changes the HTML content

      Caution: Be careful when using innerHTML with user-provided input, as it can create security vulnerabilities (Cross-Site Scripting – XSS). If you’re inserting user input, it’s generally safer to use textContent or to sanitize the input properly.

    • style: Modifies the CSS styles of an element.

      javascript
      let heading = document.getElementById("myHeading");
      heading.style.color = "blue"; // Change the text color to blue
      heading.style.fontSize = "24px"; // Change the font size

    • setAttribute(): Sets the value of an attribute.

    • getAttribute(): Gets the value of an attribute.
    • removeAttribute(): Removes an attribute.

      javascript
      let image = document.getElementById("myImage");
      image.setAttribute("src", "new-image.jpg"); // Change the image source
      let altText = image.getAttribute("alt");
      image.removeAttribute("width");

    • classList: Adds, removes, or toggles CSS classes.

      • add(): Adds classes.
      • remove(): Removes classes
      • toggle(): Toggles a class (adds if absent, removes if exists).
      • contains(): Checks if a class is set.

      javascript
      let myDiv = document.getElementById("myDiv");
      myDiv.classList.add("highlight"); // Add the "highlight" class
      myDiv.classList.remove("oldClass");
      myDiv.classList.toggle("active"); // Toggle the "active" class
      if(myDiv.classList.contains("highlight")){
      //...
      }

      * Creating and Appending Elements:
      * document.createElement(): Creates a new element.
      * element.appendChild(): Adds a child element to another element.
      * element.insertBefore(): Inserts a new node before a reference node.
      * element.removeChild(): Removes child element.

      “`javascript
      // Create a new paragraph element
      let newParagraph = document.createElement(“p”);
      newParagraph.textContent = “This is a dynamically created paragraph.”;

      // Get the element where you want to add the new paragraph (e.g., the body)
      let container = document.getElementById(“container”); // Assuming you have a

      // Append the new paragraph to the container
      container.appendChild(newParagraph);

      // Create list item
      let newItem = document.createElement(“li”);
      let list = document.getElementById(“myList”);
      list.insertBefore(newItem, list.firstChild); //Insert at beginning
      list.removeChild(list.firstChild);
      “`

Module 7: Events: Responding to User Interaction

  • What are Events?

    • Events are actions or occurrences that happen in the browser, such as a user clicking a button, moving the mouse, pressing a key, or the page finishing loading.
    • JavaScript can listen for these events and execute code in response.
  • Event Listeners:

    • addEventListener(): Attaches an event listener to an element.

      “`javascript
      let button = document.getElementById(“myButton”); // Assuming you have a

    • The first argument is the event type (e.g., “click”, “mouseover”, “keydown”).

    • The second argument is the function (event handler) that will be executed when the event occurs.
  • Common Events:

    • click: Occurs when an element is clicked.
    • mouseover: Occurs when the mouse pointer is moved over an element.
    • mouseout: Occurs when the mouse pointer is moved out of an element.
    • keydown: Occurs when a key is pressed down.
    • keyup: Occurs when a key is released.
    • keypress: Occurs when a character key is pressed.
    • submit: Occurs when a form is submitted.
    • change: Occurs when the value of an input element (e.g.,

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top