4010 words
20 minutes
JavaScript Complete Guide - From Basics to DOM Mastery
⚡ JavaScript Complete Guide - From Basics to DOM Mastery
![]()
📚 Table of Contents
Part 1: JavaScript Basics
Part 2: DOM Manipulation
- DOM Introduction
- Selecting Elements
- Modifying Elements
- Creating Elements
- Events
- Event Delegation
- Form Handling
- Local Storage
- Fetch API
- 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>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 changedlet age = 25;age = 26; // OK
// const - cannot be changedconst PI = 3.14159;// PI = 3; // Error!
// const with objects/arrays - can modify contentsconst user = { name: "Ahmed" };user.name = "Sara"; // OK (modifying property)// user = {}; // Error! (reassigning variable)Naming Rules
// Valid nameslet 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 word4. Data Types
Primitive Types
// Stringlet name = "Ahmed";let message = 'Hello';let template = `Hi ${name}`;
// Numberlet age = 25;let price = 19.99;let billion = 1e9;
// Booleanlet isActive = true;let isAdmin = false;
// Undefinedlet x;console.log(x); // undefined
// Nulllet 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 StringString(123); // "123"(123).toString(); // "123"123 + ""; // "123"
// To NumberNumber("123"); // 123parseInt("123"); // 123parseFloat("12.5"); // 12.5+"123"; // 123
// To BooleanBoolean(1); // trueBoolean(0); // falseBoolean(""); // falseBoolean("hello"); // true!!value; // Convert to boolean5. 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/Decrementlet x = 5;x++; // x = 6x--; // 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"); // falseconsole.log(5 !== "5"); // true ⭐console.log(5 > 3); // trueconsole.log(5 < 3); // falseconsole.log(5 >= 5); // trueconsole.log(5 <= 3); // falseLogical Operators
// AND (both must be true)console.log(true && true); // trueconsole.log(true && false); // false
// OR (at least one true)console.log(true || false); // trueconsole.log(false || false); // false
// NOT (opposite)console.log(!true); // falseconsole.log(!false); // true
// Nullish coalescinglet name = null;console.log(name ?? "Guest"); // "Guest"
// Optional chaininglet user = {};console.log(user?.address?.city); // undefined (no error)Assignment Operators
let x = 10;x += 5; // x = x + 5 → 15x -= 3; // x = x - 3 → 12x *= 2; // x = x * 2 → 24x /= 4; // x = x / 4 → 6x %= 4; // x = x % 4 → 2x **= 2; // x = x ** 2 → 46. Strings
Creating Strings
let str1 = "Hello";let str2 = 'World';let str3 = `Hello ${str2}`; // Template literalString Methods
let text = "Hello, World!";
// Lengthconsole.log(text.length); // 13
// Access charactersconsole.log(text[0]); // "H"console.log(text.charAt(0)); // "H"console.log(text.at(-1)); // "!" (last char)
// Findconsole.log(text.indexOf("World")); // 7console.log(text.lastIndexOf("o")); // 8console.log(text.includes("World")); // trueconsole.log(text.startsWith("Hello")); // trueconsole.log(text.endsWith("!")); // true
// Extractconsole.log(text.slice(0, 5)); // "Hello"console.log(text.slice(-6)); // "World!"console.log(text.substring(0, 5)); // "Hello"
// Transformconsole.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"]
// Repeatconsole.log("Ha".repeat(3)); // "HaHaHa"
// Padconsole.log("5".padStart(3, "0")); // "005"console.log("5".padEnd(3, "0")); // "500"Template Literals
let name = "Ahmed";let age = 25;
// String interpolationlet message = `My name is ${name} and I am ${age} years old.`;
// Multi-line stringslet html = ` <div> <h1>${name}</h1> <p>Age: ${age}</p> </div>`;
// Expressionslet 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 endarr.push(4); // [1, 2, 3, 4]
// Add to beginningarr.unshift(0); // [0, 1, 2, 3, 4]
// Remove from endarr.pop(); // [0, 1, 2, 3]
// Remove from beginningarr.shift(); // [1, 2, 3]
// Remove/Add at positionarr.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 arrayslet 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)); // trueconsole.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];
// Sortarr.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)
// Reversearr.reverse(); // Reverses in place
// Copylet copy = arr.slice(); // Shallow copylet copy2 = [...arr]; // Spread operator
// Joinconsole.log(["a", "b", "c"].join("-")); // "a-b-c"8. Objects
Creating Objects
// Object literallet user = { name: "Ahmed", age: 25, isAdmin: true, greet: function() { console.log(`Hello, ${this.name}!`); }};
// Shorthandlet name = "Ahmed";let age = 25;let user2 = { name, age }; // Same as { name: name, age: age }Accessing Properties
let user = { name: "Ahmed", age: 25 };
// Dot notationconsole.log(user.name); // "Ahmed"
// Bracket notationconsole.log(user["name"]); // "Ahmed"
// Dynamic keylet key = "age";console.log(user[key]); // 25Modifying Objects
let user = { name: "Ahmed" };
// Add propertyuser.age = 25;user["email"] = "ahmed@mail.com";
// Modify propertyuser.name = "Sara";
// Delete propertydelete user.email;
// Check if property existsconsole.log("name" in user); // trueconsole.log(user.hasOwnProperty("name")); // trueObject Methods
let user = { name: "Ahmed", age: 25 };
// Get keysconsole.log(Object.keys(user)); // ["name", "age"]
// Get valuesconsole.log(Object.values(user)); // ["Ahmed", 25]
// Get entriesconsole.log(Object.entries(user)); // [["name", "Ahmed"], ["age", 25]]
// Merge objectslet 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"
// Nestedlet 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 };
// ANDif (user.name && user.isAdmin) { console.log("Welcome, Admin!");}
// ORlet displayName = user.nickname || user.name || "Guest";
// Nullish coalescinglet 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 arraylet 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: 25break and continue
// break - exit loopfor (let i = 0; i < 10; i++) { if (i === 5) break; console.log(i); // 0, 1, 2, 3, 4}
// continue - skip iterationfor (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)); // 6console.log(sum(1, 2, 3, 4, 5)); // 15Return Multiple Values
function getUser() { return { name: "Ahmed", age: 25 };}
const { name, age } = getUser();12. Arrow Functions
Basic Syntax
// Regular functionfunction add(a, b) { return a + b;}
// Arrow functionconst 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 parametersconst greet = () => "Hello!";Arrow Functions in Callbacks
let numbers = [1, 2, 3, 4, 5];
// Regular functionnumbers.map(function(n) { return n * 2;});
// Arrow functionnumbers.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];
// Sumlet sum = numbers.reduce((acc, n) => acc + n, 0);console.log(sum); // 15
// Maxlet max = numbers.reduce((a, b) => a > b ? a : b);console.log(max); // 5find / 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); // 1some / every
let numbers = [1, 2, 3, 4, 5];
// some - at least one matchesconsole.log(numbers.some(n => n > 3)); // true
// every - all matchconsole.log(numbers.every(n => n > 0)); // trueconsole.log(numbers.every(n => n > 3)); // falsesort
let numbers = [3, 1, 4, 1, 5];
// Ascendingnumbers.sort((a, b) => a - b); // [1, 1, 3, 4, 5]
// Descendingnumbers.sort((a, b) => b - a); // [5, 4, 3, 1, 1]
// Sort stringslet 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" };
// Mergelet settings = Object.assign({}, defaults, userPrefs);// orlet 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];
// Basiclet [a, b, c] = arr;console.log(a, b, c); // 1 2 3
// Skip elementslet [first, , third] = arr;console.log(first, third); // 1 3
// Default valueslet [x = 0, y = 0, z = 0, w = 0] = arr;console.log(w); // 0
// Restlet [head, ...tail] = arr;console.log(head, tail); // 1 [2, 3]
// Swap variableslet a = 1, b = 2;[a, b] = [b, a];Object Destructuring
let user = { name: "Ahmed", age: 25, city: "Casa" };
// Basiclet { name, age } = user;console.log(name, age); // "Ahmed" 25
// Renamelet { name: userName, age: userAge } = user;console.log(userName, userAge); // "Ahmed" 25
// Default valueslet { name, country = "Morocco" } = user;console.log(country); // "Morocco"
// Nestedlet user2 = { name: "Ahmed", address: { city: "Casa", zip: "20000" }};let { address: { city } } = user2;console.log(city); // "Casa"Function Parameters
// Arrayfunction sum([a, b]) { return a + b;}sum([5, 3]); // 8
// Objectfunction greet({ name, age }) { console.log(`${name} is ${age}`);}greet({ name: "Ahmed", age: 25 });16. Spread and Rest
Spread Operator (…)
// Arrayslet arr1 = [1, 2, 3];let arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]
// Objectslet obj1 = { a: 1, b: 2 };let obj2 = { ...obj1, c: 3 }; // { a: 1, b: 2, c: 3 }
// Function argumentsfunction sum(a, b, c) { return a + b + c;}let nums = [1, 2, 3];sum(...nums); // 6Rest Parameters
// Function parametersfunction sum(...numbers) { return numbers.reduce((a, b) => a + b, 0);}sum(1, 2, 3, 4); // 10
// Destructuringlet [first, ...rest] = [1, 2, 3, 4];console.log(first); // 1console.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 promiseconst promise = new Promise((resolve, reject) => { setTimeout(() => { let success = true; if (success) { resolve("Data received!"); } else { reject("Error occurred!"); } }, 1000);});
// Use the promisepromise .then(data => console.log(data)) .catch(error => console.log(error)) .finally(() => console.log("Done"));Async/Await
// Async functionasync 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 alllet promises = [ fetch("/api/users"), fetch("/api/posts"), fetch("/api/comments")];
let results = await Promise.all(promises);
// First to completelet 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 importsimport { PI, add } from './utils.js';
// Import allimport * as utils from './utils.js';console.log(utils.PI);
// Default importimport greet from './utils.js';
// Bothimport greet, { PI, add } from './utils.js';
// Renameimport { 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 └── p22. 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 nameconst elements = document.getElementsByClassName("myClass");
// By tag nameconst elements = document.getElementsByTagName("p");
// By CSS selector (all matches)const elements = document.querySelectorAll(".myClass");const elements = document.querySelectorAll("p");
// Convert to arrayconst array = Array.from(elements);const array = [...elements];Navigation
const element = document.querySelector(".item");
// Parentelement.parentElement;element.parentNode;
// Childrenelement.children; // HTMLCollectionelement.childNodes; // NodeList (includes text nodes)element.firstElementChild;element.lastElementChild;
// Siblingselement.nextElementSibling;element.previousElementSibling;
// Closest ancestor matching selectorelement.closest(".container");23. Modifying Elements
Content
const element = document.querySelector("#myDiv");
// Text contentelement.textContent = "Hello";console.log(element.textContent);
// HTML contentelement.innerHTML = "<strong>Hello</strong>";console.log(element.innerHTML);
// Outer HTML (includes element itself)console.log(element.outerHTML);Attributes
const link = document.querySelector("a");
// Get attributelink.getAttribute("href");link.href; // Direct property
// Set attributelink.setAttribute("href", "https://google.com");link.href = "https://google.com";
// Remove attributelink.removeAttribute("target");
// Check if has attributelink.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-attrClasses
const element = document.querySelector(".item");
// Add classelement.classList.add("active");element.classList.add("class1", "class2");
// Remove classelement.classList.remove("active");
// Toggle classelement.classList.toggle("active"); // Add if missing, remove if present
// Check classelement.classList.contains("active"); // true/false
// Replace classelement.classList.replace("old", "new");
// Get all classesconsole.log(element.className); // Stringconsole.log(element.classList); // DOMTokenListStyles
const element = document.querySelector(".box");
// Set individual styleselement.style.color = "red";element.style.backgroundColor = "blue"; // camelCase!element.style.fontSize = "20px";
// Set multiple styleselement.style.cssText = "color: red; background: blue; font-size: 20px;";
// Get computed stylesconst styles = getComputedStyle(element);console.log(styles.color);console.log(styles.getPropertyValue("background-color"));24. Creating Elements
Create and Append
// Create elementconst div = document.createElement("div");div.textContent = "Hello";div.classList.add("box");
// Append to documentdocument.body.appendChild(div);
// Append to specific elementconst container = document.querySelector(".container");container.appendChild(div);
// Insert at specific positioncontainer.insertBefore(div, container.firstChild);
// Modern methodscontainer.append(div); // End (multiple allowed)container.prepend(div); // Beginningcontainer.after(div); // After containercontainer.before(div); // Before containerelement.replaceWith(newElement); // ReplaceCreate from HTML
// Using innerHTMLcontainer.innerHTML = "<div class='box'>Hello</div>";
// Using insertAdjacentHTMLcontainer.insertAdjacentHTML("beforeend", "<div>Hello</div>");// Positions: beforebegin, afterbegin, beforeend, afterendClone Elements
const original = document.querySelector(".item");const clone = original.cloneNode(true); // true = deep clonecontainer.appendChild(clone);Remove Elements
// Remove elementelement.remove();
// Remove childparent.removeChild(child);
// Clear all childrencontainer.innerHTML = "";// orwhile (container.firstChild) { container.removeChild(container.firstChild);}25. Events
Adding Event Listeners
const button = document.querySelector("#myButton");
// Add listenerbutton.addEventListener("click", function(event) { console.log("Button clicked!"); console.log(event); // Event object});
// Arrow functionbutton.addEventListener("click", (e) => { console.log("Clicked!");});
// Named functionfunction handleClick(e) { console.log("Clicked!");}button.addEventListener("click", handleClick);
// Remove listenerbutton.removeEventListener("click", handleClick);Common Events
// Mouse eventselement.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 eventsdocument.addEventListener("keydown", handler);document.addEventListener("keyup", handler);document.addEventListener("keypress", handler); // Deprecated
// Form eventsform.addEventListener("submit", handler);input.addEventListener("input", handler);input.addEventListener("change", handler);input.addEventListener("focus", handler);input.addEventListener("blur", handler);
// Document eventsdocument.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 itemdocument.querySelectorAll(".item").forEach(item => { item.addEventListener("click", handleClick);});
// Good: Delegationdocument.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 validityemail.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 validityemail.setCustomValidity("Please enter a valid email");28. Local Storage
Basic Operations
// Store datalocalStorage.setItem("name", "Ahmed");
// Get dataconst name = localStorage.getItem("name");
// Remove itemlocalStorage.removeItem("name");
// Clear alllocalStorage.clear();
// Check if existsif (localStorage.getItem("name")) { // exists}Store Objects
// Store objectconst user = { name: "Ahmed", age: 25 };localStorage.setItem("user", JSON.stringify(user));
// Get objectconst storedUser = JSON.parse(localStorage.getItem("user"));console.log(storedUser.name); // "Ahmed"Session Storage
// Same API, but data cleared when tab closessessionStorage.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/awaitasync 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 storagelet 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 preferenceif (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") );});Project 3: Live Search
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
| Feature | Syntax |
|---|---|
| Variables | let, const |
| Functions | function(), () => {} |
| Arrays | map, filter, reduce |
| Objects | { key: value } |
| Classes | class Name {} |
| Async | async/await, Promise |
DOM
| Method | Description |
|---|---|
querySelector() | Select element |
addEventListener() | Add event |
createElement() | Create element |
classList.add() | Add class |
innerHTML | Set HTML |
textContent | Set text |
Created by cat0x01 🥷🏻