π What is window?
The window object represents the browser window or tab.
It is the global object in JavaScript (in browsers).
π Everything runs inside window:
Global variables
Global functions
DOM (
document)BOM (
location,history, etc.)
π Global Scope & window
Example
var name = "Bhaskar";
function greet() {
console.log("Hello");
}Explanation
varvariables and normal functions declared globally become properties ofwindow.
console.log(window.name);
window.greet();Bhaskar
Helloβ οΈ let and const do not attach to window.
π§© Common window Properties
Property | Explanation |
|---|---|
| Accesses the HTML page (DOM) |
| Gives URL details |
| Controls back/forward |
| Browser information |
| Screen size info |
π Window Methods
1οΈβ£ alert()
alert("Welcome!");Explanation:
Shows a popup message to the user.
2οΈβ£ confirm()
const result = confirm("Are you sure?");
console.log(result);Explanation:
User clicks OK β true
User clicks Cancel β false
3οΈβ£ prompt()
const name = prompt("Enter your name:");
console.log(name);Explanation:
Takes input from the user.
β±οΈ Window Timers
setTimeout()
setTimeout(() => {
console.log("Executed after 2 seconds");
}, 2000);Explanation:
Runs code once after delay.
Executed after 2 secondssetInterval()
setInterval(() => {
console.log("Running...");
}, 1000);Explanation:
Runs code repeatedly every 1 second.
Running...
Running...
Running...π Window Size
console.log(window.innerWidth);
console.log(window.innerHeight);Explanation:
Returns the viewport width & height.
1366
768π Open & Close Window
const newTab = window.open("<https://example.com>");
newTab.close();Explanation:
open()opens a new tab/windowclose()closes it (only if opened by JS)
π― Window Events
Page Load
window.onload = () => {
console.log("Page fully loaded");
};Explanation:
Runs when the entire page (HTML, CSS, images) is loaded.
Page fully loadedWindow Resize
window.onresize = () => {
console.log("Window resized");
};Explanation:
Triggers whenever browser size changes.
Window resized<div class="infographic-windowobj">
<style>
.infographic-windowobj {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
--error: #c0392b;
--error-soft: #fbe9e7;
--mono-font: 'IBM Plex Mono', monospace;
--display-font: 'Fraunces', Georgia, serif;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', system-ui, sans-serif;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
.infographic-windowobj[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4fbf8f;
--good-soft: #16281f;
--error: #e57373;
--error-soft: #3a2222;
}
.infographic-windowobj * { box-sizing: border-box; }
.infographic-windowobj h1 { font-family: var(--display-font); font-weight: 600; margin: 0; }
.infographic-windowobj p { margin: 0; }
.infographic-windowobj button, .infographic-windowobj input { font-family: inherit; }
.wo-icon { width: 1em; height: 1em; display: inline-block; vertical-align: -0.15em; stroke: currentColor; flex-shrink: 0; }
.wo-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.wo-hero { text-align: center; margin-bottom: 1.2rem; }
.wo-hero h1 { font-size: clamp(1.35rem, 4.5vw, 1.9rem); }
.wo-hero p { color: var(--ink-soft); margin-top: 0.45rem; font-size: 0.86rem; max-width: 520px; margin-left: auto; margin-right: auto; }
.wo-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.65rem 0.85rem; font-family: var(--mono-font); font-size: 0.68rem; line-height: 1.5; white-space: pre; overflow-x: auto; margin-bottom: 0.9rem; max-width: 440px; margin-left: auto; margin-right: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-str { color: #ce9178; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-prop { color: #9cdcfe; }
.tok-cmt { color: #6a9955; }
/* --- tabs --- */
.wo-tabs { display: flex; border: 1px solid var(--line); border-radius: 6px 6px 0 0; overflow-x: auto; }
.wo-tab { flex: 1; display: flex; align-items: center; justify-content: center; gap: 0.35rem; background: var(--paper-alt); color: var(--ink-soft); border: none; border-right: 1px solid var(--line); padding: 0.65rem 0.4rem; font-family: var(--mono-font); font-size: 0.62rem; font-weight: 700; cursor: pointer; white-space: nowrap; transition: background 0.2s ease, color 0.2s ease; }
.wo-tab:last-child { border-right: none; }
.wo-tab .wo-icon { width: 13px; height: 13px; }
.wo-tab.is-active { background: var(--accent-soft); color: var(--accent); }
@media (max-width: 620px) {
.wo-tab span { display: none; }
}
.wo-panel-frame { border: 1px solid var(--line); border-top: none; border-radius: 0 0 6px 6px; padding: 1.2rem clamp(1rem, 4vw, 1.6rem) 1.4rem; margin-bottom: 1rem; }
.wo-panel { display: none; }
.wo-panel.is-active { display: block; }
.wo-panel-title { font-family: var(--mono-font); font-weight: 700; font-size: 0.86rem; text-align: center; margin-bottom: 0.3rem; }
.wo-panel-sub { font-size: 0.8rem; color: var(--ink-soft); text-align: center; margin-bottom: 1rem; line-height: 1.5; max-width: 480px; margin-left: auto; margin-right: auto; }
/* --- try it row --- */
.wo-tryrow { display: flex; gap: 0.5rem; justify-content: center; flex-wrap: wrap; margin-bottom: 0.9rem; }
.wo-btn { display: inline-flex; align-items: center; gap: 0.35rem; border: none; background: var(--accent); color: #fff; padding: 0.46rem 0.85rem; font-size: 0.76rem; font-weight: 600; border-radius: 5px; cursor: pointer; }
.wo-btn:active { transform: scale(0.96); }
.wo-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.wo-btn .wo-icon { width: 13px; height: 13px; }
.wo-btn-ghost { background: var(--paper); color: var(--ink); border: 1px solid var(--line); }
.wo-btn-ghost:hover { border-color: var(--accent); color: var(--accent); }
.wo-btn-good { background: var(--good); }
.wo-btn-error { background: var(--error); }
/* --- mock window object inspector (Global Scope tab) --- */
.wo-inspector { border: 1.5px solid var(--line); border-radius: 6px; background: var(--paper-alt); padding: 0.8rem 1rem; max-width: 380px; margin: 0 auto 1rem; text-align: left; }
.wo-inspector-title { font-family: var(--mono-font); font-size: 0.7rem; color: var(--ink-soft); margin-bottom: 0.5rem; }
.wo-inspector-list { font-family: var(--mono-font); font-size: 0.74rem; min-height: 1.6em; }
.wo-inspector-row { display: block; opacity: 0; transform: translateX(-4px); transition: opacity 0.3s ease, transform 0.3s ease; color: var(--good); margin-bottom: 0.2rem; }
.wo-inspector-row.is-shown { opacity: 1; transform: translateX(0); }
.wo-inspector-empty { color: var(--ink-soft); font-style: italic; }
.wo-reject-msg { text-align: center; font-family: var(--mono-font); font-size: 0.74rem; color: var(--error); min-height: 1.4em; margin-top: 0.3rem; animation: wo-shake 0.4s; }
@keyframes wo-shake {
0%, 100% { transform: translateX(0); }
20% { transform: translateX(-4px); }
40% { transform: translateX(4px); }
60% { transform: translateX(-3px); }
80% { transform: translateX(3px); }
}
/* --- properties table --- */
.wo-proptable { max-width: 480px; margin: 0 auto; border: 1px solid var(--line); border-radius: 6px; overflow: hidden; }
.wo-proprow { display: flex; align-items: center; gap: 0.7rem; padding: 0.6rem 0.8rem; border-top: 1px solid var(--line); cursor: pointer; transition: background 0.15s ease; }
.wo-proprow:first-child { border-top: none; }
.wo-proprow:hover { background: var(--accent-soft); }
.wo-proprow.is-active { background: var(--accent-soft); }
.wo-prop-name { font-family: var(--mono-font); font-size: 0.76rem; font-weight: 700; color: var(--accent); min-width: 128px; }
.wo-prop-desc { font-size: 0.76rem; color: var(--ink-soft); flex: 1; }
.wo-liveout { text-align: center; margin-top: 0.9rem; font-family: var(--mono-font); font-size: 0.78rem; background: #1e1e1e; color: #4fbf8f; border-radius: 5px; padding: 0.6rem 0.8rem; max-width: 460px; margin-left: auto; margin-right: auto; min-height: 1.6em; word-break: break-all; }
/* --- mock dialogs (Methods tab) --- */
.wo-mockscreen { border: 1.5px solid var(--line); border-radius: 8px; background: var(--paper-alt); padding: 1.6rem 1rem; min-height: 110px; display: flex; align-items: center; justify-content: center; position: relative; max-width: 420px; margin: 0 auto 1rem; }
.wo-dialog { background: var(--paper); border: 1.5px solid var(--line); border-radius: 6px; padding: 0.9rem 1rem; box-shadow: 0 4px 14px rgba(0,0,0,0.15); max-width: 260px; text-align: center; opacity: 0; transform: scale(0.9); transition: opacity 0.2s ease, transform 0.2s ease; }
.wo-dialog.is-shown { opacity: 1; transform: scale(1); }
.wo-dialog-msg { font-size: 0.84rem; margin-bottom: 0.7rem; }
.wo-dialog-actions { display: flex; gap: 0.5rem; justify-content: center; }
.wo-dialog-input { border: 1px solid var(--line); border-radius: 4px; padding: 0.3rem 0.5rem; font-size: 0.78rem; width: 100%; margin-bottom: 0.6rem; }
.wo-mockscreen-empty { color: var(--ink-soft); font-size: 0.78rem; font-style: italic; }
/* --- console --- */
.wo-console-label { font-family: var(--mono-font); font-size: 0.66rem; color: var(--ink-soft); text-align: center; margin: 0.9rem 0 0.4rem; }
.wo-console { margin: 0 auto; max-width: 420px; text-align: left; border: 1.5px solid var(--line); background: #1e1e1e; padding: 0.55rem 0.75rem; font-family: var(--mono-font); font-size: 0.7rem; min-height: 2.6rem; max-height: 7em; overflow-y: auto; border-radius: 5px; }
.wo-console .wo-cline { display: block; opacity: 0; transform: translateY(-3px); transition: opacity 0.2s ease, transform 0.2s ease; margin-bottom: 0.12rem; color: #4fbf8f; }
.wo-console .wo-cline.is-shown { opacity: 1; transform: translateY(0); }
.wo-console-empty { color: #6b6b6b; font-style: italic; }
/* --- mock new tab (Open/Close) --- */
.wo-tabmock { display: inline-block; border: 1.5px solid var(--accent); border-radius: 6px; overflow: hidden; opacity: 0; transform: translateY(-6px); transition: opacity 0.25s ease, transform 0.25s ease; }
.wo-tabmock.is-shown { opacity: 1; transform: translateY(0); }
.wo-tabmock-bar { background: var(--accent-soft); color: var(--accent); font-family: var(--mono-font); font-size: 0.7rem; padding: 0.4rem 0.6rem; display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; }
.wo-tabmock-close { background: none; border: none; color: var(--accent); cursor: pointer; font-weight: 700; font-size: 0.85rem; line-height: 1; padding: 0 0.2rem; }
.wo-tabmock-body { padding: 1rem; font-size: 0.78rem; color: var(--ink-soft); text-align: center; background: var(--paper); }
.wo-note { text-align: center; font-size: 0.8rem; color: var(--ink-soft); padding-top: 1.2rem; max-width: 580px; margin: 0 auto; }
.wo-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-windowobj *, .infographic-windowobj *::before, .infographic-windowobj *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="wo-wrap">
<div class="wo-hero">
<h1>What is window?</h1>
<p>The global object every browser hands you β parent of both the DOM and the BOM. Click through each tab to see it in action.</p>
</div>
<div class="wo-tabs" id="woTabs">
<button class="wo-tab is-active" data-tab="scope" type="button">
<svg class="wo-icon" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
<span>Global Scope</span>
</button>
<button class="wo-tab" data-tab="props" type="button">
<svg class="wo-icon" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 5h.01"/><path d="M3 12h.01"/><path d="M3 19h.01"/><path d="M8 5h13"/><path d="M8 12h13"/><path d="M8 19h13"/></svg>
<span>Properties</span>
</button>
<button class="wo-tab" data-tab="methods" type="button">
<svg class="wo-icon" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.268 21a2 2 0 0 0 3.464 0"/><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/></svg>
<span>Methods</span>
</button>
<button class="wo-tab" data-tab="timers" type="button">
<svg class="wo-icon" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="10" x2="14" y1="2" y2="2"/><line x1="12" x2="15" y1="14" y2="11"/><circle cx="12" cy="14" r="8"/></svg>
<span>Timers</span>
</button>
<button class="wo-tab" data-tab="size" type="button">
<svg class="wo-icon" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3H5a2 2 0 0 0-2 2v3"/><path d="M21 8V5a2 2 0 0 0-2-2h-3"/><path d="M3 16v3a2 2 0 0 0 2 2h3"/><path d="M16 21h3a2 2 0 0 0 2-2v-3"/></svg>
<span>Size & Resize</span>
</button>
<button class="wo-tab" data-tab="openclose" type="button">
<svg class="wo-icon" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h6v6"/><path d="M10 14 21 3"/><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/></svg>
<span>Open/Close</span>
</button>
</div>
<div class="wo-panel-frame">
<!-- 1. Global Scope -->
<div class="wo-panel is-active" data-panel="scope">
<div class="wo-panel-title">Global Scope & window</div>
<div class="wo-panel-sub"><code>var</code> and plain function declarations at the top level become properties of <code>window</code>. <code>let</code> and <code>const</code> never do.</div>
<div class="wo-code"><span class="tok-kw">var</span> <span class="tok-var">greetName</span> <span class="tok-punc">=</span> <span class="tok-str">"Bhaskar"</span><span class="tok-punc">;</span>
<span class="tok-kw">let</span> <span class="tok-var">secretName</span> <span class="tok-punc">=</span> <span class="tok-str">"Bhaskar"</span><span class="tok-punc">;</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">window</span><span class="tok-punc">.</span><span class="tok-prop">greetName</span><span class="tok-punc">);</span> <span class="tok-cmt">// "Bhaskar"</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">window</span><span class="tok-punc">.</span><span class="tok-prop">secretName</span><span class="tok-punc">);</span> <span class="tok-cmt">// undefined</span></div>
<div class="wo-tryrow">
<button class="wo-btn" id="woVarBtn" type="button">declare with var</button>
<button class="wo-btn wo-btn-ghost" id="woLetBtn" type="button">declare with let</button>
<button class="wo-btn wo-btn-ghost" id="woScopeReset" type="button">reset</button>
</div>
<div class="wo-inspector">
<div class="wo-inspector-title">window β own properties added so far</div>
<div class="wo-inspector-list" id="woInspectorList"><span class="wo-inspector-empty">// empty</span></div>
</div>
<div class="wo-reject-msg" id="woRejectMsg"></div>
</div>
<!-- 2. Properties -->
<div class="wo-panel" data-panel="props">
<div class="wo-panel-title">Common window Properties</div>
<div class="wo-panel-sub">Click one to read its real, live value from this page.</div>
<div class="wo-proptable" id="woProptable">
<div class="wo-proprow" data-prop="document">
<span class="wo-prop-name">window.document</span>
<span class="wo-prop-desc">Accesses the HTML page (DOM)</span>
</div>
<div class="wo-proprow" data-prop="location">
<span class="wo-prop-name">window.location</span>
<span class="wo-prop-desc">Gives URL details</span>
</div>
<div class="wo-proprow" data-prop="history">
<span class="wo-prop-name">window.history</span>
<span class="wo-prop-desc">Controls back/forward</span>
</div>
<div class="wo-proprow" data-prop="navigator">
<span class="wo-prop-name">window.navigator</span>
<span class="wo-prop-desc">Browser information</span>
</div>
<div class="wo-proprow" data-prop="screen">
<span class="wo-prop-name">window.screen</span>
<span class="wo-prop-desc">Screen size info</span>
</div>
</div>
<div class="wo-liveout" id="woPropOut">click a row above</div>
</div>
<!-- 3. Methods -->
<div class="wo-panel" data-panel="methods">
<div class="wo-panel-title">Window Methods</div>
<div class="wo-panel-sub">Simulated here so the demo doesn't block on a real browser popup β the behavior matches exactly.</div>
<div class="wo-tryrow">
<button class="wo-btn" id="woAlertBtn" type="button">alert("Welcome!")</button>
<button class="wo-btn wo-btn-ghost" id="woConfirmBtn" type="button">confirm("Are you sure?")</button>
<button class="wo-btn wo-btn-ghost" id="woPromptBtn" type="button">prompt("Enter your name:")</button>
</div>
<div class="wo-mockscreen" id="woMockscreen"><span class="wo-mockscreen-empty">// try a method above</span></div>
<div class="wo-console-label">console</div>
<div class="wo-console" id="woMethodsConsole"><span class="wo-console-empty">// waitingβ¦</span></div>
</div>
<!-- 4. Timers -->
<div class="wo-panel" data-panel="timers">
<div class="wo-panel-title">Window Timers</div>
<div class="wo-panel-sub"><code>setTimeout</code> runs once after a delay. <code>setInterval</code> keeps running until stopped.</div>
<div class="wo-tryrow">
<button class="wo-btn" id="woTimeoutBtn" type="button">setTimeout β 2s</button>
<button class="wo-btn wo-btn-good" id="woIntervalStart" type="button">setInterval β start</button>
<button class="wo-btn wo-btn-error" id="woIntervalStop" type="button" disabled>stop</button>
</div>
<div class="wo-console-label">console</div>
<div class="wo-console" id="woTimersConsole"><span class="wo-console-empty">// waitingβ¦</span></div>
</div>
<!-- 5. Size & Resize -->
<div class="wo-panel" data-panel="size">
<div class="wo-panel-title">Window Size & the resize Event</div>
<div class="wo-panel-sub">Reads your actual viewport. Try resizing this browser window β the counter below updates live via <code>window.onresize</code>.</div>
<div class="wo-tryrow">
<button class="wo-btn" id="woSizeBtn" type="button">read innerWidth / innerHeight</button>
</div>
<div class="wo-liveout" id="woSizeOut">click to read</div>
<div class="wo-console-label" style="margin-top:1.1rem;">window.onresize fired: <span id="woResizeCount">0</span> times</div>
<div class="wo-console-label">window.onload β β already fired before this loaded</div>
</div>
<!-- 6. Open/Close -->
<div class="wo-panel" data-panel="openclose">
<div class="wo-panel-title">Open & Close a Window</div>
<div class="wo-panel-sub">Simulated as a mock tab here to skip your browser's popup blocker β the API is exactly <code>window.open()</code> / <code>.close()</code>.</div>
<div class="wo-code"><span class="tok-kw">const</span> <span class="tok-var">newTab</span> <span class="tok-punc">=</span> <span class="tok-var">window</span><span class="tok-punc">.</span><span class="tok-fn">open</span><span class="tok-punc">(</span><span class="tok-str">"https://example.com"</span><span class="tok-punc">);</span>
<span class="tok-var">newTab</span><span class="tok-punc">.</span><span class="tok-fn">close</span><span class="tok-punc">();</span></div>
<div class="wo-tryrow">
<button class="wo-btn" id="woOpenBtn" type="button">window.open()</button>
</div>
<div style="text-align:center;">
<div class="wo-tabmock" id="woTabmock">
<div class="wo-tabmock-bar">
<span>example.com</span>
<button class="wo-tabmock-close" id="woCloseBtn" type="button">β</button>
</div>
<div class="wo-tabmock-body">newTab β opened by JS, so JS can close it</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-windowobj')
|| document.querySelector('.infographic-windowobj');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
// ---- tabs ----
const tabs = wrapper.querySelectorAll('.wo-tab');
const panels = wrapper.querySelectorAll('.wo-panel');
tabs.forEach(tab => {
tab.addEventListener('click', () => {
tabs.forEach(t => t.classList.remove('is-active'));
panels.forEach(p => p.classList.remove('is-active'));
tab.classList.add('is-active');
wrapper.querySelector('.wo-panel[data-panel="' + tab.dataset.tab + '"]').classList.add('is-active');
});
});
// ---- 1. Global Scope (mock window inspector) ----
const inspectorList = wrapper.querySelector('#woInspectorList');
const rejectMsg = wrapper.querySelector('#woRejectMsg');
let inspectorCleared = false;
let varAdded = false;
wrapper.querySelector('#woVarBtn').addEventListener('click', () => {
if (varAdded) return;
varAdded = true;
if (!inspectorCleared) { inspectorList.innerHTML = ''; inspectorCleared = true; }
const row = document.createElement('span');
row.className = 'wo-inspector-row';
row.textContent = 'greetName: "Bhaskar"';
inspectorList.appendChild(row);
requestAnimationFrame(() => row.classList.add('is-shown'));
rejectMsg.textContent = '';
});
wrapper.querySelector('#woLetBtn').addEventListener('click', () => {
rejectMsg.textContent = 'window.secretName β undefined (let stayed block-scoped)';
void rejectMsg.offsetWidth;
rejectMsg.style.animation = 'none';
requestAnimationFrame(() => { rejectMsg.style.animation = ''; });
});
wrapper.querySelector('#woScopeReset').addEventListener('click', () => {
varAdded = false;
inspectorCleared = false;
inspectorList.innerHTML = '<span class="wo-inspector-empty">// empty</span>';
rejectMsg.textContent = '';
});
// ---- 2. Properties (real, read-only) ----
const propRows = wrapper.querySelectorAll('.wo-proprow');
const propOut = wrapper.querySelector('#woPropOut');
propRows.forEach(row => {
row.addEventListener('click', () => {
propRows.forEach(r => r.classList.remove('is-active'));
row.classList.add('is-active');
const prop = row.dataset.prop;
let value = '';
try {
if (prop === 'document') value = 'document.title β "' + document.title + '"';
else if (prop === 'location') value = 'location.href β "' + window.location.href + '"';
else if (prop === 'history') value = 'history.length β ' + window.history.length;
else if (prop === 'navigator') value = 'navigator.userAgent β "' + window.navigator.userAgent.slice(0, 46) + 'β¦"';
else if (prop === 'screen') value = 'screen.width Γ height β ' + window.screen.width + ' Γ ' + window.screen.height;
} catch (e) {
value = 'not readable in this context';
}
propOut.textContent = value;
});
});
// ---- 3. Methods (simulated dialogs) ----
const mockscreen = wrapper.querySelector('#woMockscreen');
const methodsConsole = wrapper.querySelector('#woMethodsConsole');
let methodsConsoleCleared = false;
function logMethods(text) {
if (!methodsConsoleCleared) { methodsConsole.innerHTML = ''; methodsConsoleCleared = true; }
const line = document.createElement('span');
line.className = 'wo-cline';
line.textContent = text;
methodsConsole.appendChild(line);
requestAnimationFrame(() => line.classList.add('is-shown'));
while (methodsConsole.children.length > 5) methodsConsole.removeChild(methodsConsole.firstChild);
}
wrapper.querySelector('#woAlertBtn').addEventListener('click', () => {
mockscreen.innerHTML = '<div class="wo-dialog"><div class="wo-dialog-msg">Welcome!</div><div class="wo-dialog-actions"><button class="wo-btn" style="padding:0.3rem 0.8rem;">OK</button></div></div>';
const dialog = mockscreen.querySelector('.wo-dialog');
requestAnimationFrame(() => dialog.classList.add('is-shown'));
dialog.querySelector('button').addEventListener('click', () => {
mockscreen.innerHTML = '<span class="wo-mockscreen-empty">// dismissed</span>';
});
logMethods('alert("Welcome!") called');
});
wrapper.querySelector('#woConfirmBtn').addEventListener('click', () => {
mockscreen.innerHTML = '<div class="wo-dialog"><div class="wo-dialog-msg">Are you sure?</div><div class="wo-dialog-actions"><button class="wo-btn" data-val="true" style="padding:0.3rem 0.7rem;">OK</button><button class="wo-btn wo-btn-ghost" data-val="false" style="padding:0.3rem 0.7rem;">Cancel</button></div></div>';
const dialog = mockscreen.querySelector('.wo-dialog');
requestAnimationFrame(() => dialog.classList.add('is-shown'));
dialog.querySelectorAll('button').forEach(btn => {
btn.addEventListener('click', () => {
logMethods('confirm() β ' + btn.dataset.val);
mockscreen.innerHTML = '<span class="wo-mockscreen-empty">// dismissed</span>';
});
});
logMethods('confirm("Are you sure?") called');
});
wrapper.querySelector('#woPromptBtn').addEventListener('click', () => {
mockscreen.innerHTML = '<div class="wo-dialog"><div class="wo-dialog-msg">Enter your name:</div><input class="wo-dialog-input" type="text" placeholder="Type hereβ¦"><div class="wo-dialog-actions"><button class="wo-btn" style="padding:0.3rem 0.8rem;">OK</button></div></div>';
const dialog = mockscreen.querySelector('.wo-dialog');
requestAnimationFrame(() => dialog.classList.add('is-shown'));
dialog.querySelector('button').addEventListener('click', () => {
const val = dialog.querySelector('input').value || '(empty)';
logMethods('prompt() β "' + val + '"');
mockscreen.innerHTML = '<span class="wo-mockscreen-empty">// dismissed</span>';
});
logMethods('prompt("Enter your name:") called');
});
// ---- 4. Timers ----
const timersConsole = wrapper.querySelector('#woTimersConsole');
let timersConsoleCleared = false;
let intervalId = null;
function logTimers(text) {
if (!timersConsoleCleared) { timersConsole.innerHTML = ''; timersConsoleCleared = true; }
const line = document.createElement('span');
line.className = 'wo-cline';
line.textContent = text;
timersConsole.appendChild(line);
timersConsole.scrollTop = timersConsole.scrollHeight;
requestAnimationFrame(() => line.classList.add('is-shown'));
while (timersConsole.children.length > 6) timersConsole.removeChild(timersConsole.firstChild);
}
wrapper.querySelector('#woTimeoutBtn').addEventListener('click', (e) => {
const btn = e.currentTarget;
btn.disabled = true;
logTimers('setTimeout scheduled (2s)β¦');
setTimeout(() => {
logTimers('Executed after 2 seconds');
btn.disabled = false;
}, 2000);
});
const startBtn = wrapper.querySelector('#woIntervalStart');
const stopBtn = wrapper.querySelector('#woIntervalStop');
startBtn.addEventListener('click', () => {
startBtn.disabled = true;
stopBtn.disabled = false;
logTimers('setInterval started (every 1s)');
intervalId = setInterval(() => logTimers('Runningβ¦'), 1000);
});
stopBtn.addEventListener('click', () => {
clearInterval(intervalId);
startBtn.disabled = false;
stopBtn.disabled = true;
logTimers('interval cleared');
});
// ---- 5. Size & Resize ----
const sizeOut = wrapper.querySelector('#woSizeOut');
wrapper.querySelector('#woSizeBtn').addEventListener('click', () => {
sizeOut.textContent = 'innerWidth: ' + window.innerWidth + ' | innerHeight: ' + window.innerHeight;
});
const resizeCountEl = wrapper.querySelector('#woResizeCount');
let resizeCount = 0;
window.addEventListener('resize', () => {
if (!wrapper.isConnected) return;
resizeCount += 1;
resizeCountEl.textContent = resizeCount;
});
// ---- 6. Open/Close (mock tab) ----
const tabmock = wrapper.querySelector('#woTabmock');
wrapper.querySelector('#woOpenBtn').addEventListener('click', () => {
tabmock.classList.add('is-shown');
});
wrapper.querySelector('#woCloseBtn').addEventListener('click', () => {
tabmock.classList.remove('is-shown');
});
})();
</script>π Window vs Document
Window | Document |
|---|---|
Browser/tab | Web page |
BOM object | DOM object |
Controls browser | Controls HTML |
β Important Notes
windowis the root objectYou can omit
window.alert("Hi"); // same as window.alert()Global
varβ attached towindow
β Summary
window= browser control centerParent of DOM & BOM
Used for alerts, timers, navigation, and global access