4010 words
20 minutes
JavaScript Complete Guide - From Basics to DOM Mastery

⚡ JavaScript Complete Guide - From Basics to DOM Mastery#

JavaScript


📚 Table of Contents#

Part 1: JavaScript Basics#

  1. What is JavaScript?
  2. How to Add JavaScript
  3. Variables
  4. Data Types
  5. Operators
  6. Strings
  7. Arrays
  8. Objects
  9. Conditionals
  10. Loops
  11. Functions
  12. Arrow Functions
  13. Array Methods
  14. Object Methods
  15. Destructuring
  16. Spread and Rest
  17. Classes
  18. Promises and Async/Await
  19. Error Handling
  20. Modules

Part 2: DOM Manipulation#

  1. DOM Introduction
  2. Selecting Elements
  3. Modifying Elements
  4. Creating Elements
  5. Events
  6. Event Delegation
  7. Form Handling
  8. Local Storage
  9. Fetch API
  10. Practical Projects

Part 1: JavaScript Basics#


1. What is JavaScript?#

JavaScript is a programming language that makes web pages interactive.

What can JavaScript do?#

  • ✅ Change HTML content
  • ✅ Change CSS styles
  • ✅ React to events (clicks, typing)
  • ✅ Validate forms
  • ✅ Create animations
  • ✅ Communicate with servers

2. How to Add JavaScript#

Inline (in HTML)#

<button onclick="alert('Hello!')">Click Me</button>

Internal (in <script> tag)#

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

External (separate file) ⭐ Best#

<script src="script.js"></script>
script.js
console.log("Hello from external file!");

Script Placement#

<!-- In head with defer (waits for HTML) -->
<head>
<script src="script.js" defer></script>
</head>
<!-- At end of body (most common) -->
<body>
<!-- content -->
<script src="script.js"></script>
</body>

3. Variables#

var, let, const#

// var - old way (avoid)
var name = "Ahmed";
// let - can be changed
let age = 25;
age = 26; // OK
// const - cannot be changed
const PI = 3.14159;
// PI = 3; // Error!
// const with objects/arrays - can modify contents
const user = { name: "Ahmed" };
user.name = "Sara"; // OK (modifying property)
// user = {}; // Error! (reassigning variable)

Naming Rules#

// Valid names
let userName;
let user_name;
let _private;
let $element;
let camelCase;
// Invalid names
// let 1user; // Cannot start with number
// let user-name; // No hyphens
// let let; // Reserved word

4. Data Types#

Primitive Types#

// String
let name = "Ahmed";
let message = 'Hello';
let template = `Hi ${name}`;
// Number
let age = 25;
let price = 19.99;
let billion = 1e9;
// Boolean
let isActive = true;
let isAdmin = false;
// Undefined
let x;
console.log(x); // undefined
// Null
let empty = null;
// Symbol (unique identifier)
let id = Symbol("id");
// BigInt (large numbers)
let bigNumber = 9007199254740991n;

Check Type#

console.log(typeof "Hello"); // "string"
console.log(typeof 42); // "number"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (JS quirk)
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"

Type Conversion#

// To String
String(123); // "123"
(123).toString(); // "123"
123 + ""; // "123"
// To Number
Number("123"); // 123
parseInt("123"); // 123
parseFloat("12.5"); // 12.5
+"123"; // 123
// To Boolean
Boolean(1); // true
Boolean(0); // false
Boolean(""); // false
Boolean("hello"); // true
!!value; // Convert to boolean

5. Operators#

Arithmetic Operators#

let a = 10, b = 3;
console.log(a + b); // 13 (addition)
console.log(a - b); // 7 (subtraction)
console.log(a * b); // 30 (multiplication)
console.log(a / b); // 3.33... (division)
console.log(a % b); // 1 (modulus/remainder)
console.log(a ** b); // 1000 (power)
// Increment/Decrement
let x = 5;
x++; // x = 6
x--; // x = 5
++x; // x = 6 (pre-increment)

Comparison Operators#

console.log(5 == "5"); // true (loose equality)
console.log(5 === "5"); // false (strict equality) ⭐
console.log(5 != "5"); // false
console.log(5 !== "5"); // true ⭐
console.log(5 > 3); // true
console.log(5 < 3); // false
console.log(5 >= 5); // true
console.log(5 <= 3); // false

Logical Operators#

// AND (both must be true)
console.log(true && true); // true
console.log(true && false); // false
// OR (at least one true)
console.log(true || false); // true
console.log(false || false); // false
// NOT (opposite)
console.log(!true); // false
console.log(!false); // true
// Nullish coalescing
let name = null;
console.log(name ?? "Guest"); // "Guest"
// Optional chaining
let user = {};
console.log(user?.address?.city); // undefined (no error)

Assignment Operators#

let x = 10;
x += 5; // x = x + 5 → 15
x -= 3; // x = x - 3 → 12
x *= 2; // x = x * 2 → 24
x /= 4; // x = x / 4 → 6
x %= 4; // x = x % 4 → 2
x **= 2; // x = x ** 2 → 4

6. Strings#

Creating Strings#

let str1 = "Hello";
let str2 = 'World';
let str3 = `Hello ${str2}`; // Template literal

String Methods#

let text = "Hello, World!";
// Length
console.log(text.length); // 13
// Access characters
console.log(text[0]); // "H"
console.log(text.charAt(0)); // "H"
console.log(text.at(-1)); // "!" (last char)
// Find
console.log(text.indexOf("World")); // 7
console.log(text.lastIndexOf("o")); // 8
console.log(text.includes("World")); // true
console.log(text.startsWith("Hello")); // true
console.log(text.endsWith("!")); // true
// Extract
console.log(text.slice(0, 5)); // "Hello"
console.log(text.slice(-6)); // "World!"
console.log(text.substring(0, 5)); // "Hello"
// Transform
console.log(text.toUpperCase()); // "HELLO, WORLD!"
console.log(text.toLowerCase()); // "hello, world!"
console.log(" hi ".trim()); // "hi"
console.log(text.replace("World", "JS")); // "Hello, JS!"
console.log("a-b-c".split("-")); // ["a", "b", "c"]
// Repeat
console.log("Ha".repeat(3)); // "HaHaHa"
// Pad
console.log("5".padStart(3, "0")); // "005"
console.log("5".padEnd(3, "0")); // "500"

Template Literals#

let name = "Ahmed";
let age = 25;
// String interpolation
let message = `My name is ${name} and I am ${age} years old.`;
// Multi-line strings
let html = `
<div>
<h1>${name}</h1>
<p>Age: ${age}</p>
</div>
`;
// Expressions
let result = `2 + 2 = ${2 + 2}`; // "2 + 2 = 4"

7. Arrays#

Creating Arrays#

let fruits = ["apple", "banana", "orange"];
let numbers = [1, 2, 3, 4, 5];
let mixed = [1, "hello", true, null];
let empty = [];
let arr = new Array(3); // [undefined, undefined, undefined]

Accessing Elements#

let arr = ["a", "b", "c", "d"];
console.log(arr[0]); // "a"
console.log(arr[2]); // "c"
console.log(arr[arr.length - 1]); // "d" (last)
console.log(arr.at(-1)); // "d" (last)

Modifying Arrays#

let arr = [1, 2, 3];
// Add to end
arr.push(4); // [1, 2, 3, 4]
// Add to beginning
arr.unshift(0); // [0, 1, 2, 3, 4]
// Remove from end
arr.pop(); // [0, 1, 2, 3]
// Remove from beginning
arr.shift(); // [1, 2, 3]
// Remove/Add at position
arr.splice(1, 1); // Remove 1 at index 1: [1, 3]
arr.splice(1, 0, 2); // Add 2 at index 1: [1, 2, 3]
arr.splice(1, 1, "two"); // Replace: [1, "two", 3]
// Combine arrays
let combined = [1, 2].concat([3, 4]); // [1, 2, 3, 4]
let combined2 = [...[1, 2], ...[3, 4]]; // [1, 2, 3, 4]

Searching Arrays#

let arr = [1, 2, 3, 2, 1];
console.log(arr.indexOf(2)); // 1 (first occurrence)
console.log(arr.lastIndexOf(2)); // 3 (last occurrence)
console.log(arr.includes(3)); // true
console.log(arr.find(x => x > 2)); // 3 (first match)
console.log(arr.findIndex(x => x > 2)); // 2 (index of first match)

Other Array Methods#

let arr = [3, 1, 4, 1, 5];
// Sort
arr.sort(); // [1, 1, 3, 4, 5] (as strings!)
arr.sort((a, b) => a - b); // [1, 1, 3, 4, 5] (numbers)
arr.sort((a, b) => b - a); // [5, 4, 3, 1, 1] (descending)
// Reverse
arr.reverse(); // Reverses in place
// Copy
let copy = arr.slice(); // Shallow copy
let copy2 = [...arr]; // Spread operator
// Join
console.log(["a", "b", "c"].join("-")); // "a-b-c"

8. Objects#

Creating Objects#

// Object literal
let user = {
name: "Ahmed",
age: 25,
isAdmin: true,
greet: function() {
console.log(`Hello, ${this.name}!`);
}
};
// Shorthand
let name = "Ahmed";
let age = 25;
let user2 = { name, age }; // Same as { name: name, age: age }

Accessing Properties#

let user = { name: "Ahmed", age: 25 };
// Dot notation
console.log(user.name); // "Ahmed"
// Bracket notation
console.log(user["name"]); // "Ahmed"
// Dynamic key
let key = "age";
console.log(user[key]); // 25

Modifying Objects#

let user = { name: "Ahmed" };
// Add property
user.age = 25;
user["email"] = "ahmed@mail.com";
// Modify property
user.name = "Sara";
// Delete property
delete user.email;
// Check if property exists
console.log("name" in user); // true
console.log(user.hasOwnProperty("name")); // true

Object Methods#

let user = { name: "Ahmed", age: 25 };
// Get keys
console.log(Object.keys(user)); // ["name", "age"]
// Get values
console.log(Object.values(user)); // ["Ahmed", 25]
// Get entries
console.log(Object.entries(user)); // [["name", "Ahmed"], ["age", 25]]
// Merge objects
let extra = { city: "Casa" };
let merged = { ...user, ...extra };
let merged2 = Object.assign({}, user, extra);
// Freeze (no modifications)
Object.freeze(user);
// Seal (no add/delete, can modify)
Object.seal(user);

9. Conditionals#

if / else if / else#

let age = 18;
if (age < 13) {
console.log("Child");
} else if (age < 20) {
console.log("Teenager");
} else {
console.log("Adult");
}

Ternary Operator#

let age = 20;
let status = age >= 18 ? "Adult" : "Minor";
console.log(status); // "Adult"
// Nested
let grade = 85;
let result = grade >= 90 ? "A" : grade >= 80 ? "B" : grade >= 70 ? "C" : "F";

Switch Statement#

let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "Monday";
break;
case 2:
dayName = "Tuesday";
break;
case 3:
dayName = "Wednesday";
break;
default:
dayName = "Unknown";
}
console.log(dayName); // "Wednesday"

Logical Operators in Conditions#

let user = { name: "Ahmed", isAdmin: true };
// AND
if (user.name && user.isAdmin) {
console.log("Welcome, Admin!");
}
// OR
let displayName = user.nickname || user.name || "Guest";
// Nullish coalescing
let count = 0;
console.log(count || 10); // 10 (0 is falsy)
console.log(count ?? 10); // 0 (only null/undefined)

10. Loops#

for Loop#

for (let i = 0; i < 5; i++) {
console.log(i); // 0, 1, 2, 3, 4
}
// Loop through array
let arr = ["a", "b", "c"];
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}

while Loop#

let i = 0;
while (i < 5) {
console.log(i);
i++;
}

do…while Loop#

let i = 0;
do {
console.log(i);
i++;
} while (i < 5);

for…of (Arrays, Strings)#

let arr = ["a", "b", "c"];
for (let item of arr) {
console.log(item); // "a", "b", "c"
}
let str = "Hello";
for (let char of str) {
console.log(char); // "H", "e", "l", "l", "o"
}

for…in (Objects)#

let user = { name: "Ahmed", age: 25 };
for (let key in user) {
console.log(`${key}: ${user[key]}`);
}
// name: Ahmed
// age: 25

break and continue#

// break - exit loop
for (let i = 0; i < 10; i++) {
if (i === 5) break;
console.log(i); // 0, 1, 2, 3, 4
}
// continue - skip iteration
for (let i = 0; i < 5; i++) {
if (i === 2) continue;
console.log(i); // 0, 1, 3, 4
}

11. Functions#

Function Declaration#

function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet("Ahmed")); // "Hello, Ahmed!"

Function Expression#

const greet = function(name) {
return `Hello, ${name}!`;
};

Default Parameters#

function greet(name = "Guest") {
return `Hello, ${name}!`;
}
console.log(greet()); // "Hello, Guest!"
console.log(greet("Ahmed")); // "Hello, Ahmed!"

Rest Parameters#

function sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15

Return Multiple Values#

function getUser() {
return { name: "Ahmed", age: 25 };
}
const { name, age } = getUser();

12. Arrow Functions#

Basic Syntax#

// Regular function
function add(a, b) {
return a + b;
}
// Arrow function
const add = (a, b) => {
return a + b;
};
// Short form (implicit return)
const add = (a, b) => a + b;
// Single parameter (no parentheses needed)
const double = x => x * 2;
// No parameters
const greet = () => "Hello!";

Arrow Functions in Callbacks#

let numbers = [1, 2, 3, 4, 5];
// Regular function
numbers.map(function(n) {
return n * 2;
});
// Arrow function
numbers.map(n => n * 2);

this in Arrow Functions#

// Arrow functions don't have their own 'this'
const user = {
name: "Ahmed",
// Regular function - 'this' is the object
greet: function() {
console.log(`Hello, ${this.name}`);
},
// Arrow function - 'this' is from outer scope
greetArrow: () => {
console.log(`Hello, ${this.name}`); // undefined
}
};

13. Array Methods#

forEach#

let arr = [1, 2, 3];
arr.forEach((item, index) => {
console.log(`${index}: ${item}`);
});

map (transform)#

let numbers = [1, 2, 3];
let doubled = numbers.map(n => n * 2);
console.log(doubled); // [2, 4, 6]

filter#

let numbers = [1, 2, 3, 4, 5];
let evens = numbers.filter(n => n % 2 === 0);
console.log(evens); // [2, 4]

reduce#

let numbers = [1, 2, 3, 4, 5];
// Sum
let sum = numbers.reduce((acc, n) => acc + n, 0);
console.log(sum); // 15
// Max
let max = numbers.reduce((a, b) => a > b ? a : b);
console.log(max); // 5

find / findIndex#

let users = [
{ id: 1, name: "Ahmed" },
{ id: 2, name: "Sara" }
];
let user = users.find(u => u.id === 2);
console.log(user); // { id: 2, name: "Sara" }
let index = users.findIndex(u => u.id === 2);
console.log(index); // 1

some / every#

let numbers = [1, 2, 3, 4, 5];
// some - at least one matches
console.log(numbers.some(n => n > 3)); // true
// every - all match
console.log(numbers.every(n => n > 0)); // true
console.log(numbers.every(n => n > 3)); // false

sort#

let numbers = [3, 1, 4, 1, 5];
// Ascending
numbers.sort((a, b) => a - b); // [1, 1, 3, 4, 5]
// Descending
numbers.sort((a, b) => b - a); // [5, 4, 3, 1, 1]
// Sort strings
let names = ["Charlie", "Alice", "Bob"];
names.sort(); // ["Alice", "Bob", "Charlie"]

Chaining Methods#

let users = [
{ name: "Ahmed", age: 25 },
{ name: "Sara", age: 17 },
{ name: "Ali", age: 30 }
];
let result = users
.filter(u => u.age >= 18)
.map(u => u.name)
.sort();
console.log(result); // ["Ahmed", "Ali"]

14. Object Methods#

Object.keys / values / entries#

let user = { name: "Ahmed", age: 25 };
Object.keys(user); // ["name", "age"]
Object.values(user); // ["Ahmed", 25]
Object.entries(user); // [["name", "Ahmed"], ["age", 25]]

Object.assign / spread#

let defaults = { theme: "dark", lang: "en" };
let userPrefs = { lang: "ar" };
// Merge
let settings = Object.assign({}, defaults, userPrefs);
// or
let settings2 = { ...defaults, ...userPrefs };
console.log(settings); // { theme: "dark", lang: "ar" }

Object.fromEntries#

let entries = [["name", "Ahmed"], ["age", 25]];
let obj = Object.fromEntries(entries);
console.log(obj); // { name: "Ahmed", age: 25 }

15. Destructuring#

Array Destructuring#

let arr = [1, 2, 3];
// Basic
let [a, b, c] = arr;
console.log(a, b, c); // 1 2 3
// Skip elements
let [first, , third] = arr;
console.log(first, third); // 1 3
// Default values
let [x = 0, y = 0, z = 0, w = 0] = arr;
console.log(w); // 0
// Rest
let [head, ...tail] = arr;
console.log(head, tail); // 1 [2, 3]
// Swap variables
let a = 1, b = 2;
[a, b] = [b, a];

Object Destructuring#

let user = { name: "Ahmed", age: 25, city: "Casa" };
// Basic
let { name, age } = user;
console.log(name, age); // "Ahmed" 25
// Rename
let { name: userName, age: userAge } = user;
console.log(userName, userAge); // "Ahmed" 25
// Default values
let { name, country = "Morocco" } = user;
console.log(country); // "Morocco"
// Nested
let user2 = {
name: "Ahmed",
address: { city: "Casa", zip: "20000" }
};
let { address: { city } } = user2;
console.log(city); // "Casa"

Function Parameters#

// Array
function sum([a, b]) {
return a + b;
}
sum([5, 3]); // 8
// Object
function greet({ name, age }) {
console.log(`${name} is ${age}`);
}
greet({ name: "Ahmed", age: 25 });

16. Spread and Rest#

Spread Operator (…)#

// Arrays
let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]
// Objects
let obj1 = { a: 1, b: 2 };
let obj2 = { ...obj1, c: 3 }; // { a: 1, b: 2, c: 3 }
// Function arguments
function sum(a, b, c) {
return a + b + c;
}
let nums = [1, 2, 3];
sum(...nums); // 6

Rest Parameters#

// Function parameters
function sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4); // 10
// Destructuring
let [first, ...rest] = [1, 2, 3, 4];
console.log(first); // 1
console.log(rest); // [2, 3, 4]

17. Classes#

Basic Class#

class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, I'm ${this.name}`);
}
// Getter
get info() {
return `${this.name}, ${this.age}`;
}
// Setter
set info(value) {
[this.name, this.age] = value.split(", ");
}
// Static method
static create(name) {
return new Person(name, 0);
}
}
let person = new Person("Ahmed", 25);
person.greet(); // "Hello, I'm Ahmed"
console.log(person.info); // "Ahmed, 25"

Inheritance#

class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // Call parent constructor
this.breed = breed;
}
speak() {
console.log(`${this.name} barks`);
}
}
let dog = new Dog("Buddy", "Labrador");
dog.speak(); // "Buddy barks"

18. Promises and Async/Await#

Promises#

// Create a promise
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
let success = true;
if (success) {
resolve("Data received!");
} else {
reject("Error occurred!");
}
}, 1000);
});
// Use the promise
promise
.then(data => console.log(data))
.catch(error => console.log(error))
.finally(() => console.log("Done"));

Async/Await#

// Async function
async function fetchData() {
try {
let response = await fetch("https://api.example.com/data");
let data = await response.json();
console.log(data);
} catch (error) {
console.log("Error:", error);
}
}
fetchData();

Promise.all / Promise.race#

// Wait for all
let promises = [
fetch("/api/users"),
fetch("/api/posts"),
fetch("/api/comments")
];
let results = await Promise.all(promises);
// First to complete
let first = await Promise.race(promises);

19. Error Handling#

try / catch / finally#

try {
let result = riskyOperation();
console.log(result);
} catch (error) {
console.log("Error:", error.message);
} finally {
console.log("This always runs");
}

Throwing Errors#

function divide(a, b) {
if (b === 0) {
throw new Error("Cannot divide by zero!");
}
return a / b;
}
try {
divide(10, 0);
} catch (e) {
console.log(e.message); // "Cannot divide by zero!"
}

Custom Errors#

class ValidationError extends Error {
constructor(message) {
super(message);
this.name = "ValidationError";
}
}
throw new ValidationError("Invalid email");

20. Modules#

Export#

// Named exports (utils.js)
export const PI = 3.14159;
export function add(a, b) { return a + b; }
export class Calculator { }
// Default export (one per file)
export default function greet(name) {
return `Hello, ${name}!`;
}

Import#

// Named imports
import { PI, add } from './utils.js';
// Import all
import * as utils from './utils.js';
console.log(utils.PI);
// Default import
import greet from './utils.js';
// Both
import greet, { PI, add } from './utils.js';
// Rename
import { add as sum } from './utils.js';

Part 2: DOM Manipulation#


21. DOM Introduction#

DOM = Document Object Model

The DOM is a tree structure representing the HTML document.

document
└── html
├── head
│ └── title
└── body
├── h1
└── p

22. Selecting Elements#

Single Element#

// By ID (fastest)
const element = document.getElementById("myId");
// By CSS selector (first match)
const element = document.querySelector(".myClass");
const element = document.querySelector("#myId");
const element = document.querySelector("div.container > p");

Multiple Elements#

// By class name
const elements = document.getElementsByClassName("myClass");
// By tag name
const elements = document.getElementsByTagName("p");
// By CSS selector (all matches)
const elements = document.querySelectorAll(".myClass");
const elements = document.querySelectorAll("p");
// Convert to array
const array = Array.from(elements);
const array = [...elements];
const element = document.querySelector(".item");
// Parent
element.parentElement;
element.parentNode;
// Children
element.children; // HTMLCollection
element.childNodes; // NodeList (includes text nodes)
element.firstElementChild;
element.lastElementChild;
// Siblings
element.nextElementSibling;
element.previousElementSibling;
// Closest ancestor matching selector
element.closest(".container");

23. Modifying Elements#

Content#

const element = document.querySelector("#myDiv");
// Text content
element.textContent = "Hello";
console.log(element.textContent);
// HTML content
element.innerHTML = "<strong>Hello</strong>";
console.log(element.innerHTML);
// Outer HTML (includes element itself)
console.log(element.outerHTML);

Attributes#

const link = document.querySelector("a");
// Get attribute
link.getAttribute("href");
link.href; // Direct property
// Set attribute
link.setAttribute("href", "https://google.com");
link.href = "https://google.com";
// Remove attribute
link.removeAttribute("target");
// Check if has attribute
link.hasAttribute("target");
// Data attributes
// <div data-user-id="123" data-role="admin">
const div = document.querySelector("div");
div.dataset.userId; // "123"
div.dataset.role; // "admin"
div.dataset.newAttr = "value"; // Add data-new-attr

Classes#

const element = document.querySelector(".item");
// Add class
element.classList.add("active");
element.classList.add("class1", "class2");
// Remove class
element.classList.remove("active");
// Toggle class
element.classList.toggle("active"); // Add if missing, remove if present
// Check class
element.classList.contains("active"); // true/false
// Replace class
element.classList.replace("old", "new");
// Get all classes
console.log(element.className); // String
console.log(element.classList); // DOMTokenList

Styles#

const element = document.querySelector(".box");
// Set individual styles
element.style.color = "red";
element.style.backgroundColor = "blue"; // camelCase!
element.style.fontSize = "20px";
// Set multiple styles
element.style.cssText = "color: red; background: blue; font-size: 20px;";
// Get computed styles
const styles = getComputedStyle(element);
console.log(styles.color);
console.log(styles.getPropertyValue("background-color"));

24. Creating Elements#

Create and Append#

// Create element
const div = document.createElement("div");
div.textContent = "Hello";
div.classList.add("box");
// Append to document
document.body.appendChild(div);
// Append to specific element
const container = document.querySelector(".container");
container.appendChild(div);
// Insert at specific position
container.insertBefore(div, container.firstChild);
// Modern methods
container.append(div); // End (multiple allowed)
container.prepend(div); // Beginning
container.after(div); // After container
container.before(div); // Before container
element.replaceWith(newElement); // Replace

Create from HTML#

// Using innerHTML
container.innerHTML = "<div class='box'>Hello</div>";
// Using insertAdjacentHTML
container.insertAdjacentHTML("beforeend", "<div>Hello</div>");
// Positions: beforebegin, afterbegin, beforeend, afterend

Clone Elements#

const original = document.querySelector(".item");
const clone = original.cloneNode(true); // true = deep clone
container.appendChild(clone);

Remove Elements#

// Remove element
element.remove();
// Remove child
parent.removeChild(child);
// Clear all children
container.innerHTML = "";
// or
while (container.firstChild) {
container.removeChild(container.firstChild);
}

25. Events#

Adding Event Listeners#

const button = document.querySelector("#myButton");
// Add listener
button.addEventListener("click", function(event) {
console.log("Button clicked!");
console.log(event); // Event object
});
// Arrow function
button.addEventListener("click", (e) => {
console.log("Clicked!");
});
// Named function
function handleClick(e) {
console.log("Clicked!");
}
button.addEventListener("click", handleClick);
// Remove listener
button.removeEventListener("click", handleClick);

Common Events#

// Mouse events
element.addEventListener("click", handler);
element.addEventListener("dblclick", handler);
element.addEventListener("mouseenter", handler);
element.addEventListener("mouseleave", handler);
element.addEventListener("mousemove", handler);
element.addEventListener("mousedown", handler);
element.addEventListener("mouseup", handler);
// Keyboard events
document.addEventListener("keydown", handler);
document.addEventListener("keyup", handler);
document.addEventListener("keypress", handler); // Deprecated
// Form events
form.addEventListener("submit", handler);
input.addEventListener("input", handler);
input.addEventListener("change", handler);
input.addEventListener("focus", handler);
input.addEventListener("blur", handler);
// Document events
document.addEventListener("DOMContentLoaded", handler);
window.addEventListener("load", handler);
window.addEventListener("scroll", handler);
window.addEventListener("resize", handler);

Event Object#

element.addEventListener("click", (e) => {
// Common properties
e.target; // Element that triggered event
e.currentTarget; // Element with listener
e.type; // Event type ("click")
// Mouse position
e.clientX, e.clientY; // Relative to viewport
e.pageX, e.pageY; // Relative to document
// Keyboard
e.key; // Key pressed ("Enter")
e.code; // Physical key ("KeyA")
e.ctrlKey; // Ctrl held?
e.shiftKey; // Shift held?
e.altKey; // Alt held?
// Prevent default behavior
e.preventDefault();
// Stop propagation
e.stopPropagation();
});

26. Event Delegation#

Instead of adding listeners to many elements, add one to the parent.

// Bad: Listener on each item
document.querySelectorAll(".item").forEach(item => {
item.addEventListener("click", handleClick);
});
// Good: Delegation
document.querySelector(".container").addEventListener("click", (e) => {
if (e.target.classList.contains("item")) {
handleClick(e);
}
// Or use closest()
const item = e.target.closest(".item");
if (item) {
handleClick(item);
}
});

27. Form Handling#

Get Form Values#

const form = document.querySelector("#myForm");
form.addEventListener("submit", (e) => {
e.preventDefault(); // Prevent page reload
// Get values
const name = document.querySelector("#name").value;
const email = document.querySelector("#email").value;
// Or using FormData
const formData = new FormData(form);
const name = formData.get("name");
const email = formData.get("email");
// Convert to object
const data = Object.fromEntries(formData);
console.log(data); // { name: "...", email: "..." }
});

Form Validation#

const form = document.querySelector("#myForm");
const email = document.querySelector("#email");
// Check validity
email.addEventListener("input", () => {
if (email.validity.valid) {
// Valid
} else {
if (email.validity.valueMissing) {
console.log("Email is required");
}
if (email.validity.typeMismatch) {
console.log("Invalid email format");
}
}
});
// Set custom validity
email.setCustomValidity("Please enter a valid email");

28. Local Storage#

Basic Operations#

// Store data
localStorage.setItem("name", "Ahmed");
// Get data
const name = localStorage.getItem("name");
// Remove item
localStorage.removeItem("name");
// Clear all
localStorage.clear();
// Check if exists
if (localStorage.getItem("name")) {
// exists
}

Store Objects#

// Store object
const user = { name: "Ahmed", age: 25 };
localStorage.setItem("user", JSON.stringify(user));
// Get object
const storedUser = JSON.parse(localStorage.getItem("user"));
console.log(storedUser.name); // "Ahmed"

Session Storage#

// Same API, but data cleared when tab closes
sessionStorage.setItem("temp", "data");
sessionStorage.getItem("temp");

29. Fetch API#

GET Request#

fetch("https://api.example.com/users")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log("Error:", error));
// Async/await
async function getUsers() {
try {
const response = await fetch("https://api.example.com/users");
const data = await response.json();
console.log(data);
} catch (error) {
console.log("Error:", error);
}
}

POST Request#

fetch("https://api.example.com/users", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Ahmed",
email: "ahmed@mail.com"
})
})
.then(response => response.json())
.then(data => console.log(data));

Other Options#

fetch(url, {
method: "POST", // GET, POST, PUT, DELETE
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer token"
},
body: JSON.stringify(data),
mode: "cors",
credentials: "include" // Send cookies
});

30. Practical Projects#

Project 1: Todo List#

<div id="app">
<input type="text" id="todoInput" placeholder="Add todo...">
<button id="addBtn">Add</button>
<ul id="todoList"></ul>
</div>
const input = document.querySelector("#todoInput");
const addBtn = document.querySelector("#addBtn");
const list = document.querySelector("#todoList");
// Load from storage
let todos = JSON.parse(localStorage.getItem("todos")) || [];
function renderTodos() {
list.innerHTML = todos.map((todo, index) => `
<li class="${todo.done ? 'done' : ''}">
<span onclick="toggleTodo(${index})">${todo.text}</span>
<button onclick="deleteTodo(${index})">×</button>
</li>
`).join("");
}
function addTodo() {
if (input.value.trim()) {
todos.push({ text: input.value, done: false });
input.value = "";
saveTodos();
renderTodos();
}
}
function toggleTodo(index) {
todos[index].done = !todos[index].done;
saveTodos();
renderTodos();
}
function deleteTodo(index) {
todos.splice(index, 1);
saveTodos();
renderTodos();
}
function saveTodos() {
localStorage.setItem("todos", JSON.stringify(todos));
}
addBtn.addEventListener("click", addTodo);
input.addEventListener("keypress", (e) => {
if (e.key === "Enter") addTodo();
});
renderTodos();

Project 2: Dark Mode Toggle#

const toggle = document.querySelector("#darkModeToggle");
// Check saved preference
if (localStorage.getItem("darkMode") === "true") {
document.body.classList.add("dark-mode");
}
toggle.addEventListener("click", () => {
document.body.classList.toggle("dark-mode");
localStorage.setItem(
"darkMode",
document.body.classList.contains("dark-mode")
);
});
const searchInput = document.querySelector("#search");
const results = document.querySelector("#results");
const items = ["Apple", "Banana", "Cherry", "Date", "Fig", "Grape"];
searchInput.addEventListener("input", (e) => {
const query = e.target.value.toLowerCase();
const filtered = items.filter(item =>
item.toLowerCase().includes(query)
);
results.innerHTML = filtered.map(item =>
`<li>${item}</li>`
).join("");
});

🎯 Quick Reference#

JavaScript#

FeatureSyntax
Variableslet, const
Functionsfunction(), () => {}
Arraysmap, filter, reduce
Objects{ key: value }
Classesclass Name {}
Asyncasync/await, Promise

DOM#

MethodDescription
querySelector()Select element
addEventListener()Add event
createElement()Create element
classList.add()Add class
innerHTMLSet HTML
textContentSet text

Created by cat0x01 🥷🏻