Guest Mode:

BCA Student Stories & UpdatesLive

You
Your StorySign in & share
Er. Manoj Kumar
D5
Er. ManojActive nowPages
Day 47Advanced JavaScript & Browser APIs3 Hours Practical
Push to GitHub to Complete

Client-Side SPA Routing & Browser History API (pushState & popstate)

Modern frontend frameworks like React, Next.js, and Vue power seamless Single Page Applications (SPAs). In an SPA, the browser never downloads a fresh HTML page when navigating between sections. Instead, client-side JavaScript intercepts navigation clicks, updates the URL using the HTML5 History API, and renders the corresponding view in 0ms.

Interactive Learning Roadmap

Day 47 Step-by-Step Practical Flow

🎯1. What You Will Learn Today

✔Understand the architecture of Single Page Applications (SPAs) versus traditional multi-page sites.
✔Manipulate browser history client-side without page reloads using history.pushState().
✔Listen to browser Back/Forward navigation buttons using the window popstate event.
✔Implement declarative hash-based routing (#home, #courses, #profile) with hashchange events.
✔Build a dynamic view renderer that swaps page templates instantly based on the active route.
Day 47 MasterclassAdvanced JavaScript & Browser APIs

Client-Side SPA Routing & Browser History API (pushState & popstate) — Comprehensive Practical Guide

Har concept ko visual mental models, code anatomy aur practical industry tips ke sath samjhein.

Real-World Purpose Aur Zaroorat

Modern frontend frameworks like React, Next.js, and Vue power seamless Single Page Applications (SPAs). In an SPA, the browser never downloads a fresh HTML page when navigating between sections. Instead, client-side JavaScript intercepts navigation clicks, updates the URL using the HTML5 History API, and renders the corresponding view in 0ms.

Single Page Architecture: The entire application runs inside one primary index.html document. Different "pages" are simply state-driven view views.
history.pushState(state, title, url): Adds a new entry to the browser history and updates the address bar URL without reloading the page.
popstate Event: Fired whenever the student navigates session history using the browser Back or Forward buttons.
Hash Routing Alternative: Modifying location.hash (#/dashboard) fires hashchange without requiring server-side URL rewrite rules.
Prevent Default: Link navigation must intercept <a> tag clicks using e.preventDefault() to avoid traditional HTTP server requests.
Dimaag Mein Bithane Ka Model

"Think of traditional websites like reading a stack of separate paper textbooks: turning a page requires closing one book, putting it on a shelf, and opening another book. An SPA is like an Amazon Kindle: the physical frame never changes, but tapping a button instantly swaps the text on screen."

💡 Pro Tip: Code ko ratta mat maaro; imagine karo ki browser har tag ko visually kaise draw karta hai.

👨‍🏫3. Teacher Demonstration Code

See how views are swapped instantaneously and how the browser Back/Forward buttons remain 100% functional without page reloads.

Vanilla SPA Client-Side Router Consolehtml
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Vanilla SPA Router</title>
  <style>
    body { font-family: system-ui, sans-serif; background: #060c18; color: #fff; padding: 24px; }
    nav a { color: #94a3b8; text-decoration: none; font-weight: bold; margin-right: 12px; }
    nav a.active { color: #38bdf8; }
  </style>
</head>
<body>
  <nav id="navBar">
    <a href="#/home" class="active">🏠 Home</a>
    <a href="#/about">👨‍💻 About</a>
  </nav>
  <div id="appView" style="margin-top:20px;"></div>

  <script>
    const routes = {
      "#/home": "<h2>Welcome Home</h2><p>BCA Zero-lag practicals.</p>",
      "#/about": "<h2>About Nextsem</h2><p>Authored by Er. Manoj Kumar.</p>"
    };
    function render() {
      const hash = location.hash || "#/home";
      document.getElementById("appView").innerHTML = routes[hash] || "<h2>404</h2>";
    }
    window.addEventListener("hashchange", render);
    render();
  </script>
</body>
</html>

2. Hands-On Practical Lab: Follow Instructions in VS Code

Code like a professional software engineer! Follow the step-by-step instructions below in Visual Studio Code (VS Code) on your PC, test your output locally, and push to GitHub.

3 Coding Tasks
Interactive Coding TestAuto-Evaluates as you type

Day 47 Practical Task Test Studio

Test Score:0 / 3 Passed
1. Practical Task Specifications & Live Test Checklist:Type code below to pass tests
Task 1Call history.pushState

Call history.pushState({ page: "dashboard" }, "", "/dashboard") to update the URL client-side.

⏳ WAITING
Task 2Listen to popstate Event

Add a window popstate event listener that logs the current history state object.

⏳ WAITING
Task 3Intercept Anchor Link Clicks

Inside an anchor click event listener, call e.preventDefault() before running router logic.

⏳ WAITING
2. Type HTML & CSS Code:index.html
index.html
⚡ Real-Time Testing Active
Tab inserts 2 spaces • Live DOM refresh129 chars
Live Browser Output:
🔒 http://localhost:5500/index.html
Live
Renders live HTML & CSS typed on the left.
Interactive Bug Detective

Spot the Bug: Broken Back Button in Client-Side State Router

Tap or click on the exact line below that contains the error:

Click any code line
⚠️ Broken Code Inspector
Tap buggy line
1
function navigate(url) {
2
history.pushState(null, "", url);
3
render(url);
4
}
5
// ❌ Bug: popstate is never listened to!
Stuck? Need a detective clue before checking the solution?

Senior Developer Forensic Analysis:

pushState() informs the browser to push a history entry, but clicking the browser Back/Forward buttons does NOT automatically re-execute your custom navigate() function. You MUST attach a window.addEventListener("popstate", ...) listener to re-render the view when the user traverses their session history.

Golden Rule: Always validate code syntax and security attributes before pushing to GitHub!

📝Independent Practice: Assignment

📄 index.html

University Student Portal 4-View SPA Router

  • •Build a multi-view Single Page Application with 4 views: Overview, Lab Practicals, Grades, and Profile.
  • •Use hash-based routing (#/overview, #/practicals, #/grades, #/profile).
  • •Ensure the active navigation tab receives an emerald green highlight (#04AA6D).
  • •Support direct deep-linking: opening the URL directly with #/grades must immediately display the Grades view.
Submission Evaluation Criteria: Push spa-router.html and router.js to your GitHub repository under day-47.
Exact Assignment Solution Code: index.html

Open Visual Studio Code on your PC (code .), create index.html, paste this complete step-by-step verified code, test in your browser, and push to your GitHub repo:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>BCA Day 47 - Student Portal SPA</title>
  <style>
    body { font-family: "Segoe UI", sans-serif; background: #060c18; color: #fff; padding: 24px; }
    nav a { padding: 8px 16px; border-radius: 8px; color: #94a3b8; text-decoration: none; font-weight: bold; margin-right: 8px; }
    nav a.active { background: #04AA6D; color: #fff; }
    .card { background: #0c1328; border: 1px solid #1e293b; padding: 24px; border-radius: 12px; margin-top: 20px; }
  </style>
</head>
<body>
  <nav id="menu">
    <a href="#/overview" class="active">📊 Overview</a>
    <a href="#/practicals">💻 Practicals</a>
    <a href="#/profile">👤 Profile</a>
  </nav>
  <div class="card" id="appContent"></div>

  <script>
    const views = {
      "#/overview": "<h2>Overview</h2><p>Semester 1 progress on track.</p>",
      "#/practicals": "<h2>Practicals</h2><p>BCSL-013 Lab Units.</p>",
      "#/profile": "<h2>Profile</h2><p>Student: Er. Manoj Kumar BCA Cohort.</p>"
    };
    function update() {
      const hash = location.hash || "#/overview";
      document.getElementById("appContent").innerHTML = views[hash] || "<h2>404</h2>";
      document.querySelectorAll("#menu a").forEach(a => a.classList.toggle("active", a.getAttribute("href") === hash));
    }
    window.addEventListener("hashchange", update);
    update();
  </script>
</body>
</html>
Verified Assignment Code Solution (100% Tested & Ready to Run)

🎓4. Viva Check: Mandatory Conceptual Test

Why is the Intersection Observer API drastically more performant than using window.addEventListener("scroll") for lazy-loading images?

5. Mandatory Step: Push to GitHub to Unlock Next Lesson

Target Repo: html-css-projects

Windows 11 Terminal / VS Code
1$
mkdir day-47
Create a new project folder (day-47)
2$
cd day-47
Change working directory to day-47
3$
git checkout -b feature/day-47-spa-router
4$
git add index.html
5$
git commit -m "feat(day-47): build vanilla single page app hash router with deep-linking and dynamic template switching"
Commit staged changes with a descriptive message
6$
git push origin feature/day-47-spa-router
Push local commits directly to your remote GitHub repository
⌨️ Paste into terminal:Ctrl + V✨ Word wrap active (no horizontal cutoff)
Completion Prerequisites VerificationIncomplete Steps
Google Login
✔ Required
VS Code Implementation
Step 4 Viva Check
Own GitHub Project
Required

Exact GitHub Setup Guide & Expected Structure

Day 47 Requirements

Follow these exact folder and file names to prevent verification errors.

1. GitHub Repository
html-css-projects
Must be set to Public
2. Exact FolderNEW
day-47/ or bca-day-47/
Create inside repo root
3. Exact File NameREQUIRED
index.html
⚠️ No spaces or custom names
4. What to Submit Below
https://github.com/YOU/html-css-projects
Or direct link to index.html
Terminal Commands to Create & Push Day 47
1$
# 1. Enter your repository directory
2$
cd html-css-projects
Change working directory to html-css-projects
3$
# 2. Create the exact folder for Day 47
4$
mkdir day-47
Create a new project folder (day-47)
5$
cd day-47
Change working directory to day-47
6$
# 3. Create your code file: index.html
7$
# (Write your Day 47 homework code inside index.html)
8$
# 4. Save, stage, commit and push to GitHub:
9$
git add .
Stage all modified files and new assets for commit
10$
git commit -m "Day 47: Client-Side SPA Routing & Browser History API (pushState & popstate)"
Commit staged changes with a descriptive message
11$
git push origin main
Push local commits directly to your remote GitHub repository
⌨️ Paste into terminal:Ctrl + V✨ Word wrap active (no horizontal cutoff)
How to Avoid "Could not find your practical code file" Errors:
1.Use Lowercase index.html: Avoid spaces or custom names like Alan Turing..html or Index.HTML. Linux/GitHub servers are strictly case-sensitive.
2.Separate Day Folders: Create a new folder day-47/ for today so you don't overwrite previous days.
3.Ensure Public Visibility: If your GitHub repo is Private, automated validation cannot inspect your code. Set it to Public.
4.Check on GitHub Website: Before clicking "Verify", open your repo in Google Chrome to confirm your files were pushed to branch main.
📁 github.com/YOUR_USERNAME/html-css-projects
Branch: main
README.md# BCA Practical Portfolio overview
day-01/Day 1 Prior Lesson
└──index.html
day-02/Day 2 Prior Lesson
└──index.html
day-03/Day 3 Prior Lesson
└──index.html
day-04/Day 4 Prior Lesson
└──index.html
day-05/Day 5 Prior Lesson
└──index.html
day-06/Day 6 Prior Lesson
└──index.html
day-07/Day 7 Prior Lesson
└──index.html
day-08/Day 8 Prior Lesson
└──index.html
day-09/Day 9 Prior Lesson
└──index.html
day-10/Day 10 Prior Lesson
└──index.html
└──styles.css
day-11/Day 11 Prior Lesson
└──index.html
day-12/Day 12 Prior Lesson
└──index.html
day-13/Day 13 Prior Lesson
└──index.html
day-14/Day 14 Prior Lesson
└──index.html
day-15/Day 15 Prior Lesson
└──index.html
day-16/Day 16 Prior Lesson
└──index.html
day-17/Day 17 Prior Lesson
└──index.html
day-18/Day 18 Prior Lesson
└──index.html
day-19/Day 19 Prior Lesson
└──index.html
day-20/Day 20 Prior Lesson
└──index.html
└──styles.css
day-21/Day 21 Prior Lesson
└──index.html
day-22/Day 22 Prior Lesson
└──index.html
day-23/Day 23 Prior Lesson
└──index.html
day-24/Day 24 Prior Lesson
└──index.html
day-25/Day 25 Prior Lesson
└──index.html
day-26/Day 26 Prior Lesson
└──index.html
day-27/Day 27 Prior Lesson
└──index.html
day-28/Day 28 Prior Lesson
└──index.html
day-29/Day 29 Prior Lesson
└──index.html
day-30/Day 30 Prior Lesson
└──index.html
└──styles.css
day-31/Day 31 Prior Lesson
└──index.html
day-32/Day 32 Prior Lesson
└──index.html
day-33/Day 33 Prior Lesson
└──index.html
day-34/Day 34 Prior Lesson
└──index.html
day-35/Day 35 Prior Lesson
└──index.html
day-36/Day 36 Prior Lesson
└──index.html
day-37/Day 37 Prior Lesson
└──index.html
day-38/Day 38 Prior Lesson
└──index.html
day-39/Day 39 Prior Lesson
└──index.html
day-40/Day 40 Prior Lesson
└──index.html
day-41/Day 41 Prior Lesson
└──index.html
day-42/Day 42 Prior Lesson
└──index.html
day-43/Day 43 Prior Lesson
└──index.html
day-44/Day 44 Prior Lesson
└──index.html
day-45/Day 45 Prior Lesson
└──index.html
day-46/Day 46 Prior Lesson
└──index.html
day-47/✨ CREATE THIS FOLDER FOR TODAY (Day 47)
└──index.htmlMust contain:
Sequential Progression Enforced

You are welcome to read all notes, inspect code snippets, and practice all exercises of Day 47 freely! To officially submit your GitHub repository and unlock subsequent days in your portfolio, please complete Day 46: Browser Geolocation & Device APIs (Permission Models & Coordinate Mapping) first.

Complete Day 46 First
Curriculum & Practical Systems Authored by Er. Manoj Kumar
NextSem Academy • BCA Practical Learning Portal