đ āĻāĻ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ⧠āϝāĻž āĻļāĻŋāĻāĻŦā§āύ:
- â HTMX āĻāĻŋ āĻāĻŦāĻ āĻā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ
- â Traditional JavaScript vs HTMX āĻāϰ āĻĒāĻžāϰā§āĻĨāĻā§āϝ
- â HTMX CDN āĻĻāĻŋāϝāĻŧā§ āϏā§āĻāĻāĻĒ āĻāϰāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ
- â Live Server āĻāϰ āĻā§āϰā§āϤā§āĻŦ āĻāĻŦāĻ āϏā§āĻāĻāĻĒ
- â āĻĒā§āϰāĻĨāĻŽ HTMX āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϤā§āϰāĻŋ
- â Browser Developer Tools āĻĻāĻŋāϝāĻŧā§ HTMX āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ
âąī¸ āϏāĻŽāϝāĻŧ: ā§Šā§Ļ-ā§Ēā§Ģ āĻŽāĻŋāύāĻŋāĻ | đ āĻĒā§āϰāϝāĻŧā§āĻāύ: HTML āĻāϰ basic āĻā§āĻāĻžāύ
â ī¸ āĻ āϤā§āϝāύā§āϤ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ: Live Server āĻĒā§āϰāϝāĻŧā§āĻāύ!
HTMX āĻļā§āϧā§āĻŽāĻžāϤā§āϰ Live Server āĻ āĻāĻžāĻ āĻāϰā§! File:// protocol āĻ āĻāĻžāĻ āĻāϰāĻŦā§ āύāĻžāĨ¤
đ ī¸ Live Server āϏā§āĻāĻāĻĒ āĻāϰāĻžāϰ āĻāĻĒāĻžāϝāĻŧ:
- VS Code: “Live Server” extension install āĻāϰā§āύ
- Python:
python -m http.server 8000 - Node.js:
npx http-server - PHP:
php -S localhost:8000
āĻā§āύ āĻĒā§āϰāϝāĻŧā§āĻāύ: HTMX AJAX requests āĻĒāĻžāĻ āĻžāϝāĻŧ, āϝāĻž CORS policy āĻāϰ āĻāĻžāϰāĻŖā§ local files āĻ āĻāĻžāĻ āĻāϰ⧠āύāĻžāĨ¤
đ¤ HTMX āĻāĻŋ āĻāĻŦāĻ āĻā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ?
đ HTMX āĻāϰ āϏāĻāĻā§āĻāĻž:
HTMX āĻšāϞ āĻāĻāĻāĻŋ JavaScript library āϝāĻž HTML attributes āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠modern web features āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤ āĻāĻāĻŋ āĻāĻĒāύāĻžāĻā§ āĻāĻāĻŋāϞ JavaScript āĻā§āĻĄ āύāĻž āϞāĻŋāĻā§āĻ dynamic web applications āϤā§āϰāĻŋ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤
đ¯ HTMX āĻĻāĻŋāϝāĻŧā§ āϝāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ:
- â AJAX Requests: Page reload āĻāĻžāĻĄāĻŧāĻžāĻ data load āĻāϰāĻž
- â CSS Transitions: Smooth animations āĻāĻŦāĻ effects
- â WebSockets: Real-time communication
- â Server Sent Events: Live data updates
- â History Management: Browser back/forward button support
đ HTMX āĻāϰ āĻŽā§āϞ āϏā§āĻŦāĻŋāϧāĻžāϏāĻŽā§āĻš:
1ī¸âŖ āĻ āϤā§āϝāύā§āϤ āϏāĻšāĻ āĻļā§āĻāĻž:
HTML āĻāĻžāύāϞā§āĻ HTMX āĻļāĻŋāĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤ āĻā§āύ complex JavaScript framework āĻļā§āĻāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻāĨ¤
2ī¸âŖ āĻāĻŽ āĻā§āĻĄ āϞāĻŋāĻāϤ⧠āĻšāϝāĻŧ:
Traditional JavaScript āĻāϰ āϤā§āϞāύāĻžāϝāĻŧ ā§Žā§Ļ% āĻāĻŽ āĻā§āĻĄ āϞāĻŋāĻā§ āĻāĻāĻ āĻāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
3ī¸âŖ āĻĻā§āϰā§āϤ Development:
āĻāĻŽ āϏāĻŽāϝāĻŧā§ āĻŦā§āĻļāĻŋ functionality implement āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
4ī¸âŖ SEO Friendly:
Server-side rendering support āĻāϰā§, āϤāĻžāĻ search engines āϏāĻšāĻā§āĻ index āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
5ī¸âŖ Progressive Enhancement:
JavaScript disable āĻĨāĻžāĻāϞā§āĻ basic functionality āĻāĻžāĻ āĻāϰā§āĨ¤
6ī¸âŖ Lightweight:
āĻŽāĻžāϤā§āϰ ā§§ā§ĻKB size, āϝāĻž āĻ āύā§āϝāĻžāύā§āϝ framework āĻāϰ āϤā§āϞāύāĻžāϝāĻŧ āĻ āύā§āĻ āĻā§āĻāĨ¤
âī¸ Traditional JavaScript vs HTMX āĻāϰ āĻĒāĻžāϰā§āĻĨāĻā§āϝ
đ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āϤā§āϞāύāĻž:
đš AJAX Request āĻĒāĻžāĻ āĻžāύā§:
Traditional JavaScript āĻ:
// GET request āĻāϰ āĻāύā§āϝ
fetch('/api/data')
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.text();
})
.then(data => {
document.getElementById('result').innerHTML = data;
})
.catch(error => {
console.error('Error:', error);
document.getElementById('result').innerHTML = 'Error loading data';
});
HTMX āĻ:
<button hx-get="/api/data" hx-target="#result">
Load Data
</button>
đš Form Submission:
Traditional JavaScript āĻ:
document.getElementById('myForm').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
fetch('/submit', {
method: 'POST',
body: formData
})
.then(response => response.text())
.then(data => {
document.getElementById('response').innerHTML = data;
})
.catch(error => {
console.error('Error:', error);
});
});
HTMX āĻ:
<form hx-post="/submit" hx-target="#response">
<input type="text" name="username" placeholder="Username">
<button type="submit">Submit</button>
</form>
đš Event Handling:
Traditional JavaScript āĻ:
document.getElementById('searchInput').addEventListener('keyup', function() {
const query = this.value;
if (query.length > 2) {
fetch('/search?q=' + encodeURIComponent(query))
.then(response => response.text())
.then(data => {
document.getElementById('searchResults').innerHTML = data;
});
}
});
HTMX āĻ:
<input type="text"
hx-get="/search"
hx-target="#searchResults"
hx-trigger="keyup changed delay:300ms"
name="q"
placeholder="Search...">
đ āϏā§āĻŦāĻŋāϧāĻž āϤā§āϞāύāĻž:
| āĻŦāĻŋāώāϝāĻŧ | Traditional JavaScript | HTMX |
|---|---|---|
| āĻā§āĻĄā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖ | āĻ āύā§āĻ āĻŦā§āĻļāĻŋ (ā§§ā§Ļā§Ļ+ lines) | āĻ āύā§āĻ āĻāĻŽ (ā§Ģ-ā§§ā§Ļ lines) |
| āĻļā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ | āĻāϝāĻŧā§āĻ āĻŽāĻžāϏ | āĻāϝāĻŧā§āĻ āĻĻāĻŋāύ |
| Error Handling | Manual implementation | Built-in support |
| Maintenance | āĻāĻ āĻŋāύ | āϏāĻšāĻ |
| Performance | Framework dependent | Lightweight (10KB) |
đ§ HTMX CDN āĻĻāĻŋāϝāĻŧā§ āϏā§āĻāĻāĻĒ āĻāϰāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ
āϧāĻžāĻĒ ā§§: Basic HTML āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ
āĻĒā§āϰāĻĨāĻŽā§ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ HTML āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ:
<!DOCTYPE html>
<html lang="bn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>āĻāĻŽāĻžāϰ āĻĒā§āϰāĻĨāĻŽ HTMX āĻ
ā§āϝāĻžāĻĒ</title>
</head>
<body>
<h1>HTMX āĻā§āϏā§āĻ āĻĒā§āĻ</h1>
<p>āĻāĻāĻŋ āĻāĻŽāĻžāϰ āĻĒā§āϰāĻĨāĻŽ HTMX āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ</p>
</body>
</html>
āϧāĻžāĻĒ ā§¨: HTMX CDN āϝā§āĻ āĻāϰā§āύ
<head> section āĻ HTMX CDN link āϝā§āĻ āĻāϰā§āύ:
đš Stable Version (Recommended):
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
đš Latest Version:
<script src="https://unpkg.com/htmx.org@latest"></script>
đš Specific Version:
<script src="https://unpkg.com/htmx.org@1.9.10/dist/htmx.min.js"></script>
đĄ āĻāĻŋāĻĒ: Production āĻ āϏāĻŦāϏāĻŽāϝāĻŧ specific version āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
āϧāĻžāĻĒ ā§Š: āϏāĻŽā§āĻĒā§āϰā§āĻŖ HTML Structure
HTMX āϝā§āĻ āĻāϰāĻžāϰ āĻĒāϰ āϏāĻŽā§āĻĒā§āϰā§āĻŖ HTML āĻĢāĻžāĻāϞ:
<!DOCTYPE html>
<html lang="bn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>āĻāĻŽāĻžāϰ āĻĒā§āϰāĻĨāĻŽ HTMX āĻ
ā§āϝāĻžāĻĒ</title>
<!-- HTMX CDN āϝā§āĻ āĻāϰāĻž āĻšāϞ -->
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
<!-- Basic CSS Styling -->
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<div class="container">
<h1>āĻāĻŽāĻžāϰ āĻĒā§āϰāĻĨāĻŽ HTMX āĻ
ā§āϝāĻžāĻĒ</h1>
<p>HTMX āϏāĻĢāϞāĻāĻžāĻŦā§ load āĻšāϝāĻŧā§āĻā§!</p>
</div>
</body>
</html>
đĨī¸ Live Server āĻāϰ āĻā§āϰā§āϤā§āĻŦ āĻāĻŦāĻ āϏā§āĻāĻāĻĒ
đ¨ āĻā§āύ Live Server āĻĒā§āϰāϝāĻŧā§āĻāύ?
1ī¸âŖ CORS Policy:
Browser security āĻāϰ āĻāĻžāϰāĻŖā§ local files āĻĨā§āĻā§ AJAX requests block āĻāϰ⧠āĻĻā§āϝāĻŧāĨ¤
2ī¸âŖ File Protocol Limitation:
file:// protocol āĻ HTTP requests āĻĒāĻžāĻ āĻžāύ⧠āϝāĻžāϝāĻŧ āύāĻžāĨ¤
3ī¸âŖ Same-Origin Policy:
HTMX āĻāϰ āĻāύā§āϝ proper HTTP server āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤
4ī¸âŖ Real-world Environment:
Production environment āĻāϰ āĻŽāϤ⧠testing āĻāϰāĻžāϰ āĻāύā§āϝāĨ¤
đ ī¸ Live Server āϏā§āĻāĻāĻĒ āĻāϰāĻžāϰ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻĒāĻžāϝāĻŧ:
1ī¸âŖ VS Code Live Server Extension (āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻšāĻ):
- VS Code āĻā§āϞā§āύ
- Extensions tab āĻ āϝāĻžāύ (Ctrl+Shift+X)
- “Live Server” search āĻāϰā§āύ
- Ritwick Dey āĻāϰ Live Server install āĻāϰā§āύ
- HTML āĻĢāĻžāĻāϞ⧠right-click āĻāϰ⧠“Open with Live Server” select āĻāϰā§āύ
2ī¸âŖ Python āĻĻāĻŋāϝāĻŧā§ (Python installed āĻĨāĻžāĻāϞā§):
# Python 3.x āĻāϰ āĻāύā§āϝ
python -m http.server 8000
# Python 2.x āĻāϰ āĻāύā§āϝ
python -m SimpleHTTPServer 8000
āϤāĻžāϰāĻĒāϰ browser āĻ http://localhost:8000 āĻ āϝāĻžāύāĨ¤
3ī¸âŖ Node.js āĻĻāĻŋāϝāĻŧā§:
# http-server install āĻāϰā§āύ
npm install -g http-server
# Server āĻāĻžāϞ⧠āĻāϰā§āύ
http-server
# āĻ
āĻĨāĻŦāĻž npx āĻĻāĻŋāϝāĻŧā§
npx http-server
4ī¸âŖ PHP āĻĻāĻŋāϝāĻŧā§ (PHP installed āĻĨāĻžāĻāϞā§):
php -S localhost:8000
đ āĻĒā§āϰāĻĨāĻŽ HTMX āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϤā§āϰāĻŋ
āϧāĻžāĻĒ ā§§: Main HTML āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ
index.html āύāĻžāĻŽā§ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ:
<!DOCTYPE html>
<html lang="bn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>āĻāĻŽāĻžāϰ āĻĒā§āϰāĻĨāĻŽ HTMX āĻ
ā§āϝāĻžāĻĒ</title>
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.demo-button {
background: #007bff;
color: white;
border: none;
padding: 12px 24px;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
margin: 10px 5px;
}
.demo-button:hover {
background: #0056b3;
}
.result-area {
background: #f8f9fa;
border: 2px dashed #dee2e6;
padding: 20px;
margin-top: 20px;
border-radius: 5px;
min-height: 50px;
}
.loading {
color: #007bff;
font-weight: bold;
display: none;
text-align: center;
margin: 10px 0;
}
</style>
</head>
<body>
<div class="container">
<h1>đ āĻāĻŽāĻžāϰ āĻĒā§āϰāĻĨāĻŽ HTMX āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ</h1>
<p>āύāĻŋāĻā§āϰ āĻŦāĻžāĻāύāĻā§āϞā§āϤ⧠āĻā§āϞāĻŋāĻ āĻāϰ⧠HTMX āĻāϰ āĻāĻžāĻ āĻĻā§āĻā§āύ:</p>
<!-- HTMX Demo Buttons -->
<button class="demo-button"
hx-get="content1.html"
hx-target="#demo-result"
hx-indicator="#loading">
đĨ āĻāύā§āĻā§āύā§āĻ ā§§ āϞā§āĻĄ āĻāϰā§āύ
</button>
<button class="demo-button"
hx-get="content2.html"
hx-target="#demo-result"
hx-indicator="#loading">
đ āĻāύā§āĻā§āύā§āĻ ā§¨ āϞā§āĻĄ āĻāϰā§āύ
</button>
<button class="demo-button"
hx-get="content3.html"
hx-target="#demo-result"
hx-indicator="#loading">
đ¯ āĻāύā§āĻā§āύā§āĻ ā§Š āϞā§āĻĄ āĻāϰā§āύ
</button>
<!-- Loading Indicator -->
<div id="loading" class="loading">
đ āϞā§āĻĄ āĻšāĻā§āĻā§...
</div>
<!-- Result Area -->
<div id="demo-result" class="result-area">
āĻāĻāĻžāύ⧠HTMX response āĻĻā§āĻāĻžāĻŦā§...
</div>
</div>
</body>
</html>
āϧāĻžāĻĒ ā§¨: Content āĻĢāĻžāĻāϞāϏāĻŽā§āĻš āϤā§āϰāĻŋ āĻāϰā§āύ
đ content1.html:
<div style="background: #d4edda; padding: 20px; border-radius: 8px; border-left: 4px solid #28a745;">
<h3>đ āĻāύā§āĻā§āύā§āĻ ā§§ āϏāĻĢāϞāĻāĻžāĻŦā§ āϞā§āĻĄ āĻšāϝāĻŧā§āĻā§!</h3>
<p><strong>āϝāĻž āĻāĻā§āĻā§:</strong></p>
<ul>
<li>â
āĻāĻĒāύāĻŋ āĻŦāĻžāĻāύ⧠āĻā§āϞāĻŋāĻ āĻāϰā§āĻā§āύ</li>
<li>â
HTMX āĻāĻāĻāĻŋ GET request āĻĒāĻžāĻ āĻŋāϝāĻŧā§āĻā§</li>
<li>â
Server āĻĨā§āĻā§ āĻāĻ HTML content āĻāϏā§āĻā§</li>
<li>â
Page refresh āĻāĻžāĻĄāĻŧāĻžāĻ content update āĻšāϝāĻŧā§āĻā§</li>
</ul>
<p><strong>āϏāĻŽāϝāĻŧ:</strong> <span id="time1"></span></p>
<script>
document.getElementById('time1').textContent = new Date().toLocaleString('bn-BD');
</script>
</div>
đ content2.html:
<div style="background: #cce5ff; padding: 20px; border-radius: 8px; border-left: 4px solid #007bff;">
<h3>đ¯ āĻāύā§āĻā§āύā§āĻ ā§¨ - Target Demo āϏāĻĢāϞ!</h3>
<p>āĻāĻ content āĻāĻŋ <code>hx-target="#demo-result"</code> āĻĻāĻŋāϝāĻŧā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ element āĻ load āĻšāϝāĻŧā§āĻā§āĨ¤</p>
<p><strong>Target āĻāϰ āϏā§āĻŦāĻŋāϧāĻž:</strong></p>
<ul>
<li>â
āϝā§āĻā§āύ⧠element āĻ content load āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ</li>
<li>â
Multiple targets āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ</li>
<li>â
CSS selector āĻĻāĻŋāϝāĻŧā§ target āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ</li>
</ul>
</div>
đ content3.html:
<div style="background: #fff3cd; padding: 20px; border-radius: 8px; border-left: 4px solid #ffc107;">
<h3>⥠āĻāύā§āĻā§āύā§āĻ ā§Š - Interactive Demo!</h3>
<p>āĻāĻāĻŋ āĻāĻāĻāĻŋ interactive content exampleāĨ¤</p>
<!-- Nested HTMX Example -->
<button style="background: #28a745; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer;"
hx-get="nested-content.html"
hx-target="#nested-result">
đ āĻāϰāĻ āĻāύā§āĻā§āύā§āĻ āϞā§āĻĄ āĻāϰā§āύ
</button>
<div id="nested-result" style="margin-top: 15px; padding: 10px; background: #f8f9fa; border-radius: 4px;">
āĻāĻāĻžāύ⧠nested content āĻĻā§āĻāĻžāĻŦā§...
</div>
</div>
đ nested-content.html:
<div style="background: #e8d5ff; padding: 15px; border-radius: 6px; border-left: 3px solid #9b59b6;">
<h4>đ Nested Content āϏāĻĢāϞ!</h4>
<p>āĻāĻāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖ āĻāϰ⧠āϝ⧠HTMX response āĻāϰ āĻāĻŋāϤāϰā§āĻ HTMX attributes āĻāĻžāĻ āĻāϰā§āĨ¤</p>
<p><strong>Loaded at:</strong> <span id="nested-time"></span></p>
<script>
document.getElementById('nested-time').textContent = new Date().toLocaleString('bn-BD');
</script>
</div>
đ āĻā§āĻĄ āĻŦā§āϝāĻžāĻā§āϝāĻž:
đ HTMX Attributes āĻāϰ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ:
1ī¸âŖ hx-get="content1.html":
- āĻāĻžāĻ: content1.html āĻĢāĻžāĻāϞ⧠GET request āĻĒāĻžāĻ āĻžāϝāĻŧ
- āĻāĻāύ: Button āĻ click āĻāϰāϞ⧠(default trigger)
- Response: HTML content return āĻāϰā§
2ī¸âŖ hx-target="#demo-result":
- āĻāĻžāĻ: Response āĻāĻŋ #demo-result element āĻ āĻĻā§āĻāĻžāϝāĻŧ
- Method: innerHTML āĻĻāĻŋāϝāĻŧā§ content replace āĻāϰā§
- Selector: CSS selector āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§
3ī¸âŖ hx-indicator="#loading":
- āĻāĻžāĻ: Request āĻāϞāĻžāĻāĻžāϞā§āύ #loading element āĻĻā§āĻāĻžāϝāĻŧ
- Auto Hide: Response āĻāϏāϞ⧠automatically hide āĻšāϝāĻŧ
- CSS: display: none/block toggle āĻāϰā§
đ Browser Developer Tools āĻĻāĻŋāϝāĻŧā§ HTMX āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ
đ ī¸ DevTools āĻā§āϞāĻžāϰ āĻāĻĒāĻžāϝāĻŧ:
- Windows/Linux: F12 āĻŦāĻž Ctrl+Shift+I
- Mac: Cmd+Option+I
- Right-click: “Inspect Element” āĻŦāĻž “āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āύ”
- Menu: Browser menu â More Tools â Developer Tools
đ HTMX Debugging āĻāϰ āĻāύā§āϝ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ Tabs:
1ī¸âŖ Network Tab:
- HTMX Requests āĻĻā§āĻāĻž: āϏāĻŦ AJAX requests track āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
- Request Headers: āĻāĻŋ data āĻĒāĻžāĻ āĻžāύ⧠āĻšāĻā§āĻā§ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
- Response Headers: Server āĻĨā§āĻā§ āĻāĻŋ āĻāϏāĻā§ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
- Response Time: Performance measure āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
- Status Codes: Success/Error status āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
2ī¸âŖ Console Tab:
- HTMX Errors: āϏāĻŦ error messages āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύ
- JavaScript Logs: console.log() messages
- HTMX Events: Event monitoring āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
- Manual Commands: HTMX API functions test āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
3ī¸âŖ Elements Tab:
- DOM Changes: Real-time āĻ DOM updates āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύ
- HTMX Attributes: āϏāĻŦ attributes inspect āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
- CSS Classes: Dynamic class changes track āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
- Event Listeners: Attached events āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ
đ§ HTMX Specific Debugging Techniques:
1ī¸âŖ HTMX Logging Enable āĻāϰāĻž:
// Console āĻ āĻāĻ command āĻāĻžāϞāĻžāύ
htmx.logAll();
// āĻ
āĻĨāĻŦāĻž HTML āĻ āϝā§āĻ āĻāϰā§āύ
<script>
htmx.logAll();
</script>
2ī¸âŖ Specific Events Listen āĻāϰāĻž:
// Request āĻļā§āϰ⧠āĻšāĻāϝāĻŧāĻžāϰ āĻāĻā§
document.body.addEventListener('htmx:beforeRequest', function(evt) {
console.log('Request āĻĒāĻžāĻ āĻžāύ⧠āĻšāĻā§āĻā§:', evt.detail);
});
// Request āĻļā§āώ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰā§
document.body.addEventListener('htmx:afterRequest', function(evt) {
console.log('Response āĻĒā§āϝāĻŧā§āĻāĻŋ:', evt.detail);
});
// Content swap āĻšāĻāϝāĻŧāĻžāϰ āĻāĻā§
document.body.addEventListener('htmx:beforeSwap', function(evt) {
console.log('Content swap āĻšāĻā§āĻā§:', evt.detail);
});
// Error handling
document.body.addEventListener('htmx:responseError', function(evt) {
console.error('HTMX Error:', evt.detail);
});
3ī¸âŖ Manual HTMX Commands:
// Manual AJAX request
htmx.ajax('GET', '/api/data', '#target');
// Element āĻ trigger āĻāϰāĻž
htmx.trigger('#myButton', 'click');
// HTMX attributes add āĻāϰāĻž
htmx.process(document.getElementById('myElement'));
đ Common Debugging Scenarios:
1ī¸âŖ Request āĻĒāĻžāĻ āĻžāύ⧠āĻšāĻā§āĻā§ āύāĻž:
- â Live Server āĻāĻžāϞ⧠āĻāĻā§ āĻāĻŋāύāĻž check āĻāϰā§āύ
- â HTMX CDN properly load āĻšāϝāĻŧā§āĻā§ āĻāĻŋāύāĻž āĻĻā§āĻā§āύ
- â HTML syntax āĻ āĻŋāĻ āĻāĻā§ āĻāĻŋāύāĻž verify āĻāϰā§āύ
2ī¸âŖ Response āĻāϏāĻā§ āĻāĻŋāύā§āϤ⧠āĻĻā§āĻāĻžāĻā§āĻā§ āύāĻž:
- â hx-target selector āϏāĻ āĻŋāĻ āĻāĻā§ āĻāĻŋāύāĻž check āĻāϰā§āύ
- â Target element DOM āĻ āĻāĻā§ āĻāĻŋāύāĻž verify āĻāϰā§āύ
- â Response āĻ valid HTML āĻāĻā§ āĻāĻŋāύāĻž āĻĻā§āĻā§āύ
3ī¸âŖ Loading indicator āĻāĻžāĻ āĻāϰāĻā§ āύāĻž:
- â hx-indicator selector āĻ āĻŋāĻ āĻāĻā§ āĻāĻŋāύāĻž check āĻāϰā§āύ
- â Indicator element āĻāϰ CSS display property āĻĻā§āĻā§āύ
- â Request duration āϝāĻĨā§āώā§āĻ āĻāĻŋāύāĻž test āĻāϰā§āύ
â āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ ā§§ āϏāĻžāϰāϏāĻāĻā§āώā§āĻĒ
đ¯ āĻāĻ āϝāĻž āĻļāĻŋāĻāϞā§āύ:
- â HTMX āĻĒāϰāĻŋāĻāϝāĻŧ: āĻāĻŋ, āĻā§āύ āĻāĻŦāĻ āĻāĻŋāĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ
- â JavaScript āϤā§āϞāύāĻž: Traditional JavaScript vs HTMX āĻāϰ āĻĒāĻžāϰā§āĻĨāĻā§āϝ
- â Setup Process: CDN āĻĻāĻŋāϝāĻŧā§ HTMX āϏā§āĻāĻāĻĒ āĻāϰāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ
- â Live Server: āĻā§āύ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŦāĻ āĻāĻŋāĻāĻžāĻŦā§ āϏā§āĻāĻāĻĒ āĻāϰāĻŦā§āύ
- â First App: āĻĒā§āϰāĻĨāĻŽ working HTMX application āϤā§āϰāĻŋ
- â Debugging: Browser DevTools āĻĻāĻŋāϝāĻŧā§ HTMX debug āĻāϰāĻžāϰ āĻāĻĒāĻžāϝāĻŧ
đ§ āĻŽā§āϞ HTMX Attributes āϝāĻž āĻļāĻŋāĻā§āĻā§āύ:
- hx-get: GET request āĻĒāĻžāĻ āĻžāύā§āϰ āĻāύā§āϝ
- hx-target: Response āĻā§āĻĨāĻžāϝāĻŧ āĻĻā§āĻāĻžāĻŦā§ āϤāĻž āύāĻŋāϰā§āϧāĻžāϰāĻŖ
- hx-indicator: Loading state āĻĻā§āĻāĻžāύā§āϰ āĻāύā§āϝ
đ¯ āĻĒāϰāĻŦāϰā§āϤ⧠āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ⧠āϝāĻž āĻļāĻŋāĻāĻŦā§āύ:
āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ ⧍: HTTP Methods āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ
- hx-get, hx-post, hx-put, hx-delete, hx-patch
- āĻā§āύ Method āĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ
- RESTful API concepts
- Form handling āĻāĻŦāĻ data submission
đ Practice āĻāϰāĻžāϰ āĻāύā§āϝ:
- āĻāĻāĻāĻŋ āύāϤā§āύ HTML āĻĒā§āĻ āϤā§āϰāĻŋ āĻāϰā§āύ
- HTMX CDN āϝā§āĻ āĻāϰā§āύ āĻāĻŦāĻ Live Server āĻāĻžāϞ⧠āĻāϰā§āύ
- ā§ŠāĻāĻŋ āĻāϞāĻžāĻĻāĻž content āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰā§āύ
- āĻŦāĻŋāĻāĻŋāύā§āύ āĻŦāĻžāĻāύ āĻĻāĻŋāϝāĻŧā§ āϏā§āĻā§āϞ⧠load āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰā§āύ
- DevTools āĻĻāĻŋāϝāĻŧā§ Network tab āĻāĻŦāĻ Console monitor āĻāϰā§āύ
đ āĻĒāϰāĻŦāϰā§āϤ⧠āϧāĻžāĻĒ
āĻāĻ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāϰāĻžāϰ āĻĒāϰ āĻāĻĒāύāĻŋ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ ⧍: HTTP Methods āĻ āϝā§āϤ⧠āĻĒāĻžāϰā§āύ āϝā§āĻāĻžāύ⧠GET, POST, PUT, DELETE āĻāĻŦāĻ PATCH āĻāϰ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻļāĻŋāĻāĻŦā§āύāĨ¤
Happy Coding! đ