সরাসরি পর্বে যান
পর্ব ৩৭ · ৫৫-এর মধ্যে · মডিউল ৬

HTML-এ লিংক, ছবি, টেবিল আর ফর্ম

HTML Links, Images, Tables and Forms — Turning a Page into a Website

Taught in Bangla, this lesson turns a page into a website with HTML: hyperlinks with the a element, absolute and relative paths and link types, images with img, alt text and figure, tables with rows, columns, colspan and rowspan, forms with inputs and labels, embedding iframes, audio and video, and building a small school website, with advice on checking AI-generated tables and forms.

এই পর্বে যা শিখবেন

  • লিংক কেন ওয়েবের প্রাণ; absolute আর relative URL, ফোল্ডারের মধ্যে ঠিকানা মেলানো, আর internal, external, ইমেইল ও bookmark লিংক
  • ছবি বসানো, ছবির ফরম্যাট বাছাই, ভালো alt লেখা, figure-figcaption আর ছবিকে লিংক বানানো
  • টেবিলের গঠন, পুরোনো border/cellpadding/cellspacing বনাম CSS, আর colspan-rowspan দিয়ে ক্লাস রুটিন বানানো
  • ফর্ম জমা দিলে আসলে কী যায় — action, method, GET বনাম POST, input-এর ধরন, label, validation আর তার সীমা
  • iframe, audio, video দিয়ে মানচিত্র ও ভিডিও বসানো, আর সব মিলিয়ে একটি ছোট স্কুল-সাইটের পরিকল্পনা

১ · “হাইপার” মানে লিংক — পাতা থেকে জাল

পর্ব ৩৬-এ আপনি প্রথম ওয়েব পেজ বানিয়েছেন — শিরোনাম, অনুচ্ছেদ, তালিকা। কিন্তু সেই পাতা একা। সে অন্য কোনো পাতার কথা জানে না, কোনো ছবি দেখায় না, আর দর্শক তাকে কিছু বলতেও পারেন না। একটি বইয়ের ছেঁড়া পাতার মতো।

HTML-এর পুরো নাম HyperText Markup Language. এখানে “HyperText” শব্দটিই আসল। সাধারণ লেখা পড়তে হয় শুরু থেকে শেষ, ক্রমানুসারে। হাইপারটেক্সটে লেখার ভেতরে বসানো থাকে লিংক — একটি শব্দে ক্লিক করলেই অন্য পাতায়, অন্য দেশের অন্য সার্ভারে চলে যাওয়া যায়। কোটি কোটি পাতা এভাবে একে অপরের সাথে সুতোয় বাঁধা — মাকড়সার জালের মতো। এ কারণেই নাম World Wide Web.

মূল ধারণা

এই পর্বের চারটি জিনিস একটি পাতাকে পুরো ওয়েবসাইট বানায়। লিংক পাতাগুলোকে জোড়ে। ছবি লেখার পাশে চোখে দেখার জিনিস আনে। টেবিল তথ্যকে সারি-কলামে শৃঙ্খলায় সাজায়। আর ফর্ম প্রথমবারের মতো যোগাযোগকে দুই-মুখী করে — দর্শক শুধু পড়েন না, তথ্য পাঠাতেও পারেন। ভর্তির আবেদন, পরীক্ষার ফল খোঁজা, bKash-এ লগইন — সবই আসলে ফর্ম।

উপমা: একটি স্কুলের নোটিশ বোর্ডের কথা ভাবুন। লিংক হলো নোটিশের নিচে লেখা “বিস্তারিত দেখুন অফিস কক্ষের ফাইলে”। ছবি হলো বার্ষিক ক্রীড়ার ছবি। টেবিল হলো ক্লাস রুটিন — দিন আর সময়ের ঘর। আর ফর্ম হলো অফিসের জানালায় রাখা ভর্তির আবেদনপত্র — শিক্ষার্থী পূরণ করে জমা দেন, অফিস যাচাই করে খাতায় তোলে। ওয়েবে শুধু কাগজের বদলে HTML, আর অফিসের বদলে সার্ভার।

একটি ছোট শব্দের হিসাব আগে মনে করিয়ে দিই। <a href="about.html">-এ a হলো ট্যাগ, আর href="about.html" হলো একটি attribute — শুরুর ট্যাগের ভেতরে নাম="মান" আকারে লেখা বাড়তি তথ্য, যা বলে ট্যাগটি ঠিক কী করবে। এই পর্বের প্রায় সব কাজ attribute-নির্ভর।

২ · লিংক — <a href>, ঠিকানার ধরন আর লিংকের প্রকারভেদ

লিংক বানায় <a> (anchor) ট্যাগ। href (hypertext reference) attribute-এ লেখা থাকে গন্তব্য, আর শুরু ও শেষ ট্যাগের মাঝের লেখাটি পাতায় নীল, দাগ-টানা হয়ে দেখায়:

<!-- বাইরের সাইট: পূর্ণ ঠিকানা (absolute URL) -->
<a href="https://www.wikipedia.org/">উইকিপিডিয়া</a>

<!-- নিজের সাইটের ভেতরে: বর্তমান পাতা থেকে গোনা (relative URL) -->
<a href="about.html">আমাদের সম্পর্কে</a>
<a href="../index.html">হোম পেজে ফিরুন</a>

<!-- নতুন ট্যাবে খুলবে -->
<a href="https://www.wikipedia.org/" target="_blank" rel="noopener">উইকিপিডিয়া (নতুন ট্যাবে)</a>

<!-- একই পাতার একটি অংশে (bookmark) -->
<a href="#routine">ক্লাস রুটিন দেখুন</a>
...
<h2 id="routine">ক্লাস রুটিন</h2>

<!-- ইমেইল, ফোন আর ডাউনলোড -->
<a href="mailto:office@school.example">অফিসে ইমেইল করুন</a>
<a href="tel:+8801700000000">ফোন করুন</a>
<a href="files/admission-form.pdf" download>ভর্তির ফর্ম (PDF)</a>

Absolute আর relative ঠিকানা

একটি URL-এর তিন অংশ পর্ব ১৩-এ দেখেছেন — protocol (https://), ডোমেইন (school.example), আর path (/site/pages/about.html). লিংকের ঠিকানা লেখার দুই পথ:

  • Absolute URL: সব অংশসহ পূর্ণ ঠিকানা। যে পাতা থেকেই লেখা হোক, একই জায়গা বোঝায়। অন্য সাইটে লিংক দিতে এটিই লাগে।
  • Relative URL: শুধু পথের অংশ, বর্তমান পাতার অবস্থান থেকে গোনা। ব্রাউজার বর্তমান পাতার ফোল্ডারের সাথে জুড়ে পূর্ণ ঠিকানা বানায়। নিজের সাইটের ভেতরে এটিই ভালো — সাইট অন্য ডোমেইনে সরালেও লিংক ভাঙে না, আর নিজের কম্পিউটারে ফাইল খুলেও পরীক্ষা করা যায়।

পর্ব ২৯-এ কমান্ড লাইনে relative path দেখেছেন — নিয়ম হুবহু এক। ফাঁকা নাম বা ./ মানে “এই ফোল্ডারেই”, ../ মানে “এক ফোল্ডার ওপরে”, আর / দিয়ে শুরু হলে মানে “সাইটের একেবারে গোড়া থেকে” (root-relative). একটি উদাহরণে চার ধরনের ঠিকানা মেলাই:

বর্তমান পাতা: https://school.example/site/pages/about.html
href
শুরু কোথা থেকে
কী হলো
চূড়ান্ত ঠিকানা
  1. আগে বর্তমান ফোল্ডার বের করুন। ঠিকানা থেকে শেষের ফাইলের নাম (about.html) বাদ দিন — বাকি থাকে /site/pages/. প্রতিটি relative লিংক এখান থেকে গোনা শুরু হয়।
  2. ../index.html — ../ বলে এক ফোল্ডার ওপরে উঠুন: /site/pages/ থেকে /site/. সেখানে index.html. ফল /site/index.html. দুই ধাপ উঠতে হলে ../../.
  3. img/logo.png — কোনো চিহ্ন নেই, তাই বর্তমান ফোল্ডারের ভেতরেই img খোঁজা হবে: /site/pages/img/logo.png. খুব সাধারণ ভুল এখানেই — লোগো যদি আসলে /site/img/-এ থাকে, ছবি ভেঙে যাবে। ঠিক লেখা হতো ../img/logo.png.
  4. /contact.html — শুরুতে /, তাই বর্তমান ফোল্ডার ভুলে যান; ডোমেইনের গোড়া থেকে: school.example/contact.html. খেয়াল করুন, /site/ এখানে নেই! সাইট কোনো সাব-ফোল্ডারে থাকলে, বা নিজের কম্পিউটারে ফাইল সরাসরি খুললে (file://), এমন লিংক ভাঙে।
  5. https://www.wikipedia.org/ — protocol দিয়ে শুরু, তাই absolute: বর্তমান পাতা যেখানেই থাক, একই জায়গা। মনে রাখার নিয়ম: অন্য সাইট = absolute; নিজের সাইট = relative, আর ../ গুনে গুনে।

নতুন ট্যাবে খোলা — target আর rel

target="_blank" লিংকটি নতুন ট্যাবে খোলে। বাইরের সাইটে এমন লিংকে rel="noopener" যোগ করা পুরোনো নিরাপত্তা-অভ্যাস: এটি না থাকলে নতুন পাতাটি জাভাস্ক্রিপ্ট দিয়ে আপনার পুরোনো ট্যাবটিকে চুপিচুপি একটি নকল লগইন পাতায় বদলে দিতে পারত (phishing-এর একটি কৌশল)। আধুনিক ব্রাউজার এখন _blank-এ নিজেই noopener ধরে নেয়, তবু লিখে রাখা ভালো। আর সব লিংক নতুন ট্যাবে খোলাবেন না — দর্শক নিজেই ঠিক করতে চান; নতুন ট্যাব মূলত বাইরের সাইট বা ফর্ম পূরণের মাঝে সাহায্যের পাতার জন্য।

লিংকের প্রকারভেদ — পাঠ্যবইয়ের ভাষায়

ধরনকোথায় নিয়ে যায়href-এর উদাহরণ
Internal (অভ্যন্তরীণ)একই ওয়েবসাইটের অন্য পাতায়about.html, ../index.html
External (বাহ্যিক)অন্য ওয়েবসাইটেhttps://www.wikipedia.org/
Bookmark (একই পাতার অংশে)পাতার যে উপাদানের id মেলে, সেখানে স্ক্রল#routine, about.html#team
Emailদর্শকের ইমেইল অ্যাপে নতুন মেইলmailto:office@school.example
ফোন ও ডাউনলোডফোনে কল; ফাইল নামানোtel:+880...; download attribute

Bookmark লিংকে #-এর পরের অংশকে বলে fragment. পাতার কোনো উপাদানে id="routine" দিলেই সেটি গন্তব্য হয়ে যায় — এই পর্বের পাশের সূচিপত্রের প্রতিটি লিংক ঠিক এভাবে কাজ করে (#s1, #s2 …). পুরোনো HTML-এ এর জন্য <a name="..."> লেখা হতো; এখন যেকোনো উপাদানের id-ই যথেষ্ট। mailto: লিংক সুবিধাজনক, তবে ঠিকানাটি পাতায় খোলা থাকে বলে স্প্যাম-প্রোগ্রাম তা সংগ্রহ করতে পারে; অনেক প্রতিষ্ঠান তাই যোগাযোগের ফর্ম ব্যবহার করে। download attribute শুধু নিজের সাইটের ফাইলে কাজ করে — ব্রাউজার ফাইলটি খোলার বদলে নামিয়ে নেয়।

“এখানে ক্লিক করুন” লিখবেন না। screen reader ব্যবহারকারীরা প্রায়ই পাতার সব লিংকের তালিকা শুনে বেছে নেন — সেখানে দশবার “এখানে ক্লিক করুন” কোনো কাজের নয়। সার্চ ইঞ্জিনও লিংকের লেখা থেকে বোঝে গন্তব্য পাতাটি কী নিয়ে। খারাপ: ভর্তির ফর্মের জন্য <a>এখানে ক্লিক করুন</a>. ভালো: <a>ভর্তির আবেদন ফর্ম (PDF, ২০০ KB)</a> — লেখাটি একা পড়লেও বোঝা যায় কোথায় যাবে, আর ফাইল হলে ধরন ও মাপও জানা যায়।

৩ · ছবি — <img>, alt লেখা আর figure

ছবি বসায় <img> ট্যাগ. এর শেষ ট্যাগ নেই — ভেতরে লেখার কিছু নেই, সব তথ্য attribute-এ:

<img src="img/sports-day.jpg"
     alt="বার্ষিক ক্রীড়ায় ১০০ মিটার দৌড়ের শুরু, ছয়জন শিক্ষার্থী"
     width="800" height="450" loading="lazy">

<!-- ছবির সাথে পাতায় দেখানো ক্যাপশন -->
<figure>
  <img src="img/library.jpg" alt="নতুন পাঠাগারের তাকভর্তি বই, জানালার পাশে পড়ার টেবিল" width="800" height="533">
  <figcaption>২০২৬ সালে চালু হওয়া স্কুল পাঠাগার</figcaption>
</figure>

<!-- ছবিই লিংক: লোগোতে চাপলে হোম পেজ -->
<a href="index.html"><img src="img/logo.png" alt="আদর্শ উচ্চ বিদ্যালয় — হোম পেজ" width="120" height="40"></a>
Attributeকাজ
srcছবির ঠিকানা — relative বা absolute, লিংকের মতোই নিয়ম। এটি না দিলে ছবি নেই।
altবিকল্প লেখা — ছবি না দেখা গেলে বা না দেখতে পেলে এটি পড়া হয়।
width, heightপিক্সেলে মাপ। ছবি নামার আগেই ব্রাউজার জায়গা রেখে দেয়, তাই পড়ার সময় লেখা হঠাৎ নিচে লাফায় না।
titleমাউস রাখলে ছোট টিপ — ঐচ্ছিক, alt-এর বিকল্প নয়।
border, alignপুরোনো পাঠ্যবইয়ে পাবেন; HTML5-এ বাতিল — এখন CSS দিয়ে করা হয়।

কোন ফরম্যাট কখন

পর্ব ২৮-এ দেখেছেন ছবি কীভাবে pixel আর compression হয়। ওয়েবে সংক্ষেপে: আলোকচিত্রে JPEG (বা নতুন WebP/AVIF — একই মানের ছবিতে আরও ছোট ফাইল); লোগো, স্ক্রিনশট আর স্বচ্ছ পটভূমিতে PNG; আইকন আর রেখাচিত্রে SVG, যা যত বড়ই করুন ঝাপসা হয় না; ছোট নড়াচড়া দেখাতে GIF চলে, তবে ছোট ভিডিও প্রায়ই অনেক হালকা। ফোনে তোলা ৪০০০ পিক্সেল চওড়া ৫ MB-এর ছবি সরাসরি তুলবেন না — ৮০০–১৬০০ পিক্সেলে ছোট করে নিন; গ্রামের দুর্বল মোবাইল নেটে এই পার্থক্য পাতা খোলা আর না খোলার পার্থক্য।

ভালো alt লেখা — accessibility আর SEO

alt লেখা তিন জায়গায় কাজে লাগে। এক, দৃষ্টিপ্রতিবন্ধী দর্শকের screen reader ছবির জায়গায় এটি পড়ে শোনায় — এটাই ওয়েবের accessibility-এর প্রথম নিয়ম। দুই, ছবি না নামলে (ভুল ঠিকানা, ধীর নেট) তার জায়গায় লেখাটি দেখা যায়। তিন, সার্চ ইঞ্জিন ছবি “দেখে” না, alt পড়ে বোঝে। ভালো alt ছোট, নির্দিষ্ট, আর ছবির উদ্দেশ্য বলে:

  • খারাপ: alt="image1", alt="ছবি", বা ফাইলের নাম — কিছুই বলে না।
  • ভালো: alt="বিজ্ঞান মেলায় সৌরচালিত পানির পাম্পের মডেল দেখাচ্ছে দুই শিক্ষার্থী".
  • লিংক-ছবি: alt বলবে গন্তব্য — লোগো-লিংকে “… — হোম পেজ”।
  • শুধু সাজসজ্জার ছবি: alt="" (ফাঁকা) — screen reader তখন এড়িয়ে যায়। alt একেবারে বাদ দিলে অনেক screen reader ফাইলের নাম পড়ে ফেলে।

<figure> আর <figcaption> ছবি আর তার ক্যাপশনকে একটি একক হিসেবে বাঁধে — পত্রিকার ছবির নিচের লেখার মতো। ক্যাপশন সবাই দেখেন; alt ছবির বর্ণনা, ক্যাপশন ছবির প্রসঙ্গ — দুটি আলাদা কাজ। আর এক লাইনে responsive image: CSS-এ img { max-width: 100%; height: auto; } দিলে ছবি ফোনের পর্দার বাইরে যায় না; চাইলে srcset দিয়ে ফোনে ছোট আর বড় পর্দায় বড় ফাইল পাঠানো যায়।

৪ · টেবিল — সারি, কলাম আর জোড়া ঘর

পরীক্ষার ফল, ট্রেনের সময়সূচি, পণ্যের দামের তালিকা — যেখানে তথ্য স্বভাবতই সারি আর কলামে থাকে, সেখানে HTML table. গঠন চার স্তরের:

  • <table> — পুরো টেবিল; ভেতরে প্রথমে ঐচ্ছিক <caption>, টেবিলের শিরোনাম।
  • <tr> (table row) — একটি সারি।
  • <th> (table header) — শিরোনামের ঘর; <td> (table data) — সাধারণ ঘর।
  • <thead>, <tbody>, <tfoot> — সারিগুলোকে শিরোনাম, মূল অংশ আর সারসংক্ষেপ (যেমন “মোট”) ভাগে বাঁধে। লম্বা টেবিল ছাপলে অনেক ব্রাউজার প্রতি পাতায় thead আবার ছাপে।

<th scope="col"> বলে এটি কলামের শিরোনাম, scope="row" বলে সারির। দেখতে কোনো পার্থক্য নেই, কিন্তু screen reader তখন প্রতিটি ঘরের সাথে পড়ে — “সোমবার, ১০টা: ICT”. শুধু মোটা লেখার জন্য th ব্যবহার করবেন না, আর শিরোনামকে td-তে <b> দিয়ে মোটা করেও কাজ সারবেন না।

border, cellpadding, cellspacing — পাঠ্যবই বনাম আজকের CSS

HSC-র পাঠ্যবই আর পুরোনো অনেক উদাহরণে টেবিলের চেহারা ঠিক করা হয় attribute দিয়ে। পরীক্ষার জন্য এগুলো জানতে হবে, আর জানতে হবে আজকের বিকল্পও:

<!-- পুরোনো ধাঁচ (পাঠ্যবই ও পরীক্ষায় দেখবেন) -->
<table border="1" cellpadding="8" cellspacing="0">
  <caption>অর্ধবার্ষিক পরীক্ষার ফল</caption>
  <tr><th>রোল</th><th>নাম</th><th>ICT</th></tr>
  <tr><td>1</td><td>তানিয়া</td><td>92</td></tr>
</table>

<!-- আজকের ধাঁচ: একই চেহারা CSS দিয়ে -->
<style>
  table { border-collapse: collapse; }        /* cellspacing="0"-এর কাজ */
  th, td { border: 1px solid #555;            /* border="1"-এর কাজ */
           padding: 8px; }                    /* cellpadding="8"-এর কাজ */
</style>
  • border: টেবিল আর ঘরের চারপাশে দাগ; border="0" বা না দিলে দাগ নেই।
  • cellpadding: ঘরের দেয়াল থেকে ভেতরের লেখার দূরত্ব — বাক্সের ভেতরের ফাঁক। CSS-এ padding.
  • cellspacing: দুটি ঘরের দেয়ালের মাঝের ফাঁক — বাক্সে বাক্সে দূরত্ব। CSS-এ border-spacing, আর একেবারে জোড়া দাগ চাইলে border-collapse: collapse.

মনে রাখার কৌশল: padding = ভেতরে (লেখা আর দেয়াল), spacing = বাইরে (ঘর আর ঘর)। cellpadding আর cellspacing HTML5-এ বাতিল (obsolete) — ব্রাউজার এখনো বোঝে, কিন্তু নতুন পাতায় CSS ব্যবহার করুন।

colspan আর rowspan — ক্লাস রুটিনের জোড়া ঘর

স্কুলের রুটিনে প্রায়ই দেখবেন, ব্যবহারিক ক্লাস দুই পিরিয়ড জুড়ে, আর টিফিনের ঘর সব দিনের জন্য একটিই — ওপর থেকে নিচ পর্যন্ত লম্বা। Word বা Excel-এর টেবিলে একে বলে “Merge Cells” (পর্ব ০৯)। HTML-এ:

  • colspan="2" — ঘরটি পাশাপাশি দুই কলাম জুড়ে (আড়াআড়ি জোড়া)। ওই সারিতে একটি ঘর কম লিখতে হয়।
  • rowspan="3" — ঘরটি ওপর-নিচে তিন সারি জুড়ে (খাড়া জোড়া)। নিচের দুই সারিতে ওই কলামের ঘরটি আর লিখতে হয় না।

ব্রাউজার টেবিলটিকে একটি খালি গ্রিড হিসেবে ভাবে, আর প্রতিটি সারির ঘরগুলো বাঁ থেকে ডানে প্রথম খালি জায়গায় বসায়। আগের কোনো rowspan যে জায়গা দখল করে রেখেছে, তা এড়িয়ে যায়। চার সারি আর পাঁচ কলামের একটি রুটিন ঘর-ঘর করে ভরাট হতে দেখুন:

৪ সারি × ৫ কলাম = ২০টি জায়গা · “·” = এখনো খালি · “↓” = ওপরের rowspan দখল করেছে · “←” = বাঁয়ের colspan দখল করেছে
সারি ১
সারি ২
সারি ৩
সারি ৪
  1. শিরোনামের সারি। <thead><tr>-এ পাঁচটি <th scope="col">: দিন, ৯টা, ১০টা, ১১টা, ১২টা। পাঁচটি ঘর, পাঁচটি কলাম — কোনো জোড়া নেই। এই সারিই ঠিক করে দেয়, টেবিল পাঁচ কলামের।
  2. রবিবারের সারি শুরু। <th scope="row">রবি</th><td>বাংলা</td><td>ইংরেজি</td> — বাঁ থেকে প্রথম তিনটি খালি জায়গায় বসল।
  3. টিফিন — rowspan="3". <td rowspan="3">টিফিন</td> বসল কলাম ৪-এ, আর একই সাথে নিচের দুই সারির কলাম ৪ আগাম দখল করে রাখল (↓)। এই কারণেই সোম আর মঙ্গলবারের সারিতে টিফিনের ঘর আর লিখতে হবে না।
  4. রবিবার শেষ। <td>গণিত</td> বসল কলাম ৫-এ। রবিবারের সারিতে ৫টি ঘর লেখা হলো, ৫টি জায়গা ভরল।
  5. সোমবার — colspan. <th scope="row">সোম</th><td colspan="2">ICT ব্যবহারিক</td><td>পদার্থ</td>. ICT দুই কলাম (২ আর ৩) নিল। পরের ঘর “পদার্থ” প্রথম খালি জায়গা খোঁজে — কলাম ৪ টিফিনের দখলে, তাই সোজা কলাম ৫-এ। এই সারিতে মাত্র ৩টি ঘর লেখা, অথচ ৫টি জায়গা ভরা।
  6. মঙ্গলবার। চারটি ঘর লেখা: মঙ্গল, রসায়ন, জীব, ধর্ম — ধর্ম আবার কলাম ৪ ডিঙিয়ে ৫-এ। হিসাব মেলান: লেখা ঘর ৫ + ৫ + ৩ + ৪ = ১৭টি; ICT একটি বাড়তি আর টিফিন দুটি বাড়তি জায়গা নিয়েছে — ১৭ + ৩ = ২০। কোনো সারিতে একটি ঘর বেশি লিখলে টেবিল ডানে বেরিয়ে যেত — rowspan-এর পর এই ভুলটিই সবচেয়ে সাধারণ।

নিজে চালিয়ে দেখুন — রুটিন আর লিংকের তালিকা

নিচের কোডের ওপরে যে HTML বসানো, তা Run চাপলে আসল পাতার মতো দেখা যাবে: ওপরের রুটিনটি, আর তার নিচে ছয়টি লিংক। ছোট স্ক্রিপ্টটি টেবিলের প্রতিটি সারির ঘর গোনে, আর প্রতিটি লিংকের href ধরে নেয় যে পাতাটি school.example/site/pages/about.html-এ আছে — তারপর পূর্ণ ঠিকানা বের করে, ঠিক যেমন ব্রাউজার করে।

const page = 'https://school.example/site/pages/about.html'; // ধরা যাক পাতাটি এখানে
const tbl = document.getElementById('routine');
let cells = 0, slots = 0;
for (const row of tbl.rows) {
  const list = [...row.cells];
  cells += list.length;
  slots += list.reduce((sum, c) => sum + c.colSpan * c.rowSpan, 0);
  console.log(`row ${row.rowIndex}: ${list.length} cells | ` + list.map(c => c.textContent).join(' | '));
}
console.log(`rows: ${tbl.rows.length}, cells written: ${cells}, grid slots filled: ${slots} (4 x 5 = 20)`);
console.log('---- links ----');
for (const a of document.querySelectorAll('#links a')) {
  const href = a.getAttribute('href');                  // যা লেখা আছে
  console.log(href.padEnd(28), '->', new URL(href, page).href); // যেখানে যাবে
}
document.addEventListener('click', (e) => {             // প্রিভিউতে লিংক চাপলে কোথাও যাবে না
  if (e.target.closest('a')) e.preventDefault();
});

প্রথম চার লাইনে প্রতিটি সারি: row 0: 5 cells, row 1: 5 cells, row 2: 3 cells | সোম | ICT ব্যবহারিক | পদার্থ, row 3: 4 cells. তারপর rows: 4, cells written: 17, grid slots filled: 20 (4 x 5 = 20) — stepper-এর হিসাবই, এবার ব্রাউজারের মুখে। এরপর লিংক: ../index.html -> https://school.example/site/index.html, img/logo.png -> https://school.example/site/pages/img/logo.png, /contact.html -> https://school.example/contact.html, #routine -> https://school.example/site/pages/about.html#routine (একই পাতা, শুধু শেষে fragment), আর বাইরের সাইট ও mailto: যেমন ছিল তেমনই। এবার HTML-এ টিফিনের rowspan="3" বদলে "2" করে দেখার কথা ভাবুন: মঙ্গলবারের “ধর্ম” কলাম ৪-এ সরে আসবে আর কলাম ৫ খালি থাকবে — রুটিন ভুল, অথচ ব্রাউজার কোনো ভুলবার্তা দেবে না।

টেবিল কখন নয়: ১৯৯০-এর দশকে পুরো পাতার নকশা — বাঁয়ে মেনু, মাঝে লেখা, ওপরে ব্যানার — টেবিলের ঘরে ঘরে বানানো হতো (ভাবনার প্রশ্ন ৩)। আজ এটি ভুল পথ: screen reader পুরো পাতাকে তথ্যের টেবিল ভেবে ঘর ধরে ধরে পড়ে, ফোনের ছোট পর্দায় কলাম গুটিয়ে আনা যায় না, আর নকশা বদলাতে HTML-ই নতুন করে লিখতে হয়। নিয়ম সরল: তথ্য সারি-কলামের হলে টেবিল; পাতার বিন্যাস হলে CSS (Flexbox, Grid). আর চওড়া টেবিল ফোনে যেন পুরো পাতা ডানে না ঠেলে, তাই এই পর্বের টেবিলগুলোর মতো একটি স্ক্রল-করা বাক্সে রাখুন।

৫ · ফর্ম — দর্শক যখন কথা বলেন

এ পর্যন্ত সব তথ্য গেছে এক দিকে — সার্ভার থেকে দর্শকের কাছে। ফর্ম উল্টো পথ খোলে। <form> ট্যাগের দুটি মূল attribute:

  • action: জমা দিলে তথ্য কোন ঠিকানায় যাবে — সার্ভারের যে প্রোগ্রাম তথ্যটি গ্রহণ করবে, যেমন action="/register".
  • method: পাঠানোর ধরন — get (না দিলে এটিই) বা post. পর্ব ৩৩-এর HTTP method এরাই।

GET আর POST — খোলা পোস্টকার্ড বনাম খামে ভরা চিঠি

GET

তথ্য বসে URL-এর পেছনে, ? চিহ্নের পরে — query string: /search?q=dhaka&page=2. ঠিকানা-বারে, ব্রাউজারের ইতিহাসে, সার্ভারের লগে সব দেখা যায়; bookmark বা শেয়ারও করা যায়। খোঁজা, ছাঁকা, পাতা বদলানো — যা কিছু শুধু “চাওয়া” — তার জন্য।

সার্চ · ফিল্টার · শেয়ারযোগ্য

POST

তথ্য যায় HTTP অনুরোধের ভেতরে (body), URL-এ নয়। পাসওয়ার্ড, ব্যক্তিগত তথ্য, বড় লেখা, ফাইল আপলোড, আর যে কাজে সার্ভারে কিছু বদলায় — নিবন্ধন, অর্ডার, টাকা পাঠানো — তার জন্য। ফাইল পাঠাতে লাগে enctype="multipart/form-data".

লগইন · নিবন্ধন · আপলোড

POST মানেই গোপন নয়। POST শুধু তথ্যকে ঠিকানা-বার আর ইতিহাস থেকে সরিয়ে রাখে। পথে কেউ যেন পড়তে না পারে, সেই কাজ HTTPS-এর এনক্রিপশনের (পর্ব ৪৪)। HTTP-তে POST-ও খোলা চিঠির মতোই পড়া যায়।

ফর্মের উপাদান

প্রায় সব ঘরই <input> — শুধু type বদলায়। মোবাইলে type অনুযায়ী কিবোর্ডও বদলায়: email-এ @ চিহ্ন, number-এ সংখ্যার প্যাড।

typeকী দেখায় / কী নেয়উদাহরণ ব্যবহার
textএক লাইনের লেখা (না দিলে এটিই)নাম, ঠিকানা
passwordলেখা ঢেকে বিন্দু দেখায়লগইন
email@ সহ ইমেইল কি না যাচাই করেযোগাযোগের ইমেইল
numberসংখ্যা; min, max দেওয়া যায়বয়স, পরিমাণ
dateক্যালেন্ডার থেকে তারিখ বাছাইজন্ম তারিখ
radioএকই name-এর কয়েকটির মধ্যে একটিমাত্রবিভাগ: বিজ্ঞান/ব্যবসায়/মানবিক
checkboxযতগুলো খুশি টিককোন কোন ক্লাবে যোগ দেবেন
fileকম্পিউটার বা ফোন থেকে ফাইল বাছাইছবি, সনদের স্ক্যান
submit, resetজমা দেওয়ার বোতাম; সব ঘর মুছে আগের অবস্থায় ফেরানোর বোতাম“জমা দিন”, “মুছুন”

এর বাইরে তিনটি উপাদান: <select> আর তার ভেতরের <option> — ড্রপডাউন তালিকা (জেলা বাছাই); <textarea> — কয়েক লাইনের লেখা (মন্তব্য); আর <button> — বোতাম, যার ভেতরে লেখা বা আইকন রাখা যায়। সম্পর্কিত ঘরগুলোকে <fieldset> দিয়ে বেঁধে <legend>-এ নাম দেওয়া যায় — যেমন তিনটি radio-র ওপরে “বিভাগ”।

label — প্রতিটি ঘরের নাম

<label for="em">ইমেইল</label> <input id="em" ...> — label-এর for আর ঘরের id মিললে দুটি জোড়া লাগে। লাভ দুটি: লেবেলের লেখায় চাপলেও ঘর বাছাই হয় (ছোট radio বা checkbox-এ ফোনে আঙুল দিয়ে চাপা অনেক সহজ), আর screen reader ঘরে ঢুকলে বলে “ইমেইল, লেখার ঘর”। label ছাড়া ঘরটি তাঁর কাছে শুধু “লেখার ঘর” — কী লিখতে হবে বোঝার উপায় নেই। placeholder (ঘরের ভেতরের হালকা উদাহরণ-লেখা) label-এর বিকল্প নয় — লিখতে শুরু করলেই মুছে যায়।

name আর value — আসলে যা পাঠানো হয়

ফর্ম জমা দিলে ব্রাউজার পাতার লেবেল বা নকশা কিছুই পাঠায় না — পাঠায় শুধু name=মান জোড়া. প্রতিটি ঘরের name attribute হলো সার্ভারের কাছে ওই তথ্যের নাম। name না থাকলে ঘরটি পাঠানোই হয় না — নতুনদের খুব সাধারণ ভুল। radio আর checkbox-এ যে value লেখা থাকে সেটিই যায়, পাশের বাংলা লেখা নয়; আর টিক না দেওয়া checkbox একেবারেই যায় না।

  1. পূরণinputদর্শক
  2. যাচাইrequiredব্রাউজার
  3. জোড়াname=মানএনকোড
  4. অনুরোধGET / POSTHTTPS
  5. সার্ভারactionআবার যাচাই
পাতায় যা দেখা যায়শিক্ষার্থী পূরণ করলেন
নাম:     [Nusrat Jahan        ]
ইমেইল:   [nusrat@example.com  ]
বিভাগ:   (•) বিজ্ঞান  ( ) ব্যবসায়  ( ) মানবিক
ক্লাব:    [x] ICT ক্লাব  [ ] বিতর্ক ক্লাব
         [ জমা দিন ]
ব্রাউজারের যাচাইHTML attribute থেকে
student_name  required          -> ফাঁকা নয়       ✓
email         type="email"      -> @ আছে            ✓
phone         pattern="01[3-9][0-9]{8}"
                                -> ফাঁকা, ঐচ্ছিক    ✓
group         required (radio)  -> একটি বাছা হয়েছে  ✓
name=মান জোড়ালেবেল আর নকশা বাদ
student_name=Nusrat Jahan
email=nusrat@example.com
group=science
course=ict
(টিক না দেওয়া "debate" checkbox পাঠানোই হয় না)
একই তথ্য, দুই পথেএনকোড করা
method="get"  ->  ঠিকানা-বারে দেখা যাবে
GET /register?student_name=Nusrat+Jahan&email=nusrat%40example.com&group=science&course=ict

method="post" ->  URL পরিষ্কার, তথ্য body-তে
POST /register
Content-Type: application/x-www-form-urlencoded

student_name=Nusrat+Jahan&email=nusrat%40example.com&group=science&course=ict
সার্ভারে/register প্রোগ্রাম
১. প্রতিটি মান আবার যাচাই (ব্রাউজারকে বিশ্বাস নয়)
২. ইমেইল আগে নিবন্ধিত কি না দেখা
৩. ডেটাবেসে নিরাপদে সংরক্ষণ
৪. উত্তর: নতুন পাতা — "আবেদন গৃহীত, আবেদন নম্বর 2026-0457"
  1. দর্শক পূরণ করলেন। নাম, ইমেইল, একটি radio, একটি checkbox. এখনো কিছুই কোথাও যায়নি — সব আছে দর্শকের ব্রাউজারেই।
  2. ব্রাউজারের যাচাই। “জমা দিন” চাপতেই ব্রাউজার HTML-এ লেখা নিয়ম দেখে: required ঘর ফাঁকা কি না, email-এ @ আছে কি না, pattern মেলে কি না। কোনো ভুল থাকলে সেখানেই থেমে ঘরের পাশে বার্তা দেখায় — সার্ভার পর্যন্ত যায়ই না। এটি দর্শকের সময় বাঁচায়।
  3. name=মান জোড়া। ব্রাউজার প্রতিটি name-যুক্ত ঘর থেকে একটি জোড়া বানায়। বাংলা লেবেল, রং, নকশা — কিছুই যায় না। radio-র ক্ষেত্রে যায় তার value (science), পাশের লেখা “বিজ্ঞান” নয়।
  4. এনকোড করে পাঠানো। জোড়াগুলো & দিয়ে জোড়া লাগে, আর URL-এ চলে না এমন অক্ষর বদলে যায় — ফাঁকা জায়গা +, @ হয় %40, বাংলা অক্ষর %E0%A6… আকারে (URL encoding). GET হলে এই লেখা URL-এর পেছনে বসে; POST হলে অনুরোধের body-তে। দুই ক্ষেত্রেই HTTPS থাকলে পথে এনক্রিপ্টেড।
  5. সার্ভারের কাজ। action-এর প্রোগ্রাম তথ্য পায় আর সব আবার যাচাই করে — কারণ ব্রাউজারের যাচাই যে কেউ বন্ধ করে দিতে পারে, বা ফর্ম ছাড়াই সরাসরি অনুরোধ পাঠাতে পারে। তারপর ডেটাবেসে রাখে (পর্ব ৪১) আর উত্তরে একটি নতুন পাতা পাঠায়। পরীক্ষার ফল দেখার সাইটে রোল আর বোর্ড বসিয়ে জমা দিলে ঠিক এটিই ঘটে।

ব্রাউজারে যাচাই — required, placeholder, pattern

HTML নিজেই কিছু validation জানে, কোনো জাভাস্ক্রিপ্ট ছাড়াই: required (ফাঁকা রাখা যাবে না), type="email" বা number (ধরন মেলাতে হবে), min/max, maxlength, আর pattern — একটি নিয়ম-ছাঁচ (regular expression). যেমন বাংলাদেশের মোবাইল নম্বরের জন্য pattern="01[3-9][0-9]{8}": শুরুতে 01, তারপর ৩ থেকে ৯-এর একটি অঙ্ক, তারপর আরও ৮টি অঙ্ক — মোট ১১টি। নিচের রেজিস্ট্রেশন ফর্মে এগুলো একসাথে দেখুন। স্ক্রিপ্টটি আগে ফাঁকা ফর্ম যাচাই করে, তারপর দুটি ভুলসহ পূরণ করে, তারপর ঠিক করে জমা দেয় — কিন্তু preventDefault() দিয়ে আসল পাঠানো থামিয়ে দেখায় কী পাঠানো হতো:

const f = document.getElementById('reg');
const bad = () => [...new Set([...f.elements]
  .filter(el => el.name && !el.validity.valid).map(el => el.name))].join(', ');
console.log('empty form valid?', f.checkValidity(), '| problems:', bad());
f.student_name.value = 'Nusrat Jahan';
f.email.value = 'nusrat.example.com';      // @ নেই
f.phone.value = '1712345678';              // 01 দিয়ে শুরু নয়
console.log('after first try:', bad());
f.email.value = 'nusrat@example.com';
f.phone.value = '01712345678';
f.group.value = 'science';                 // radio বাছাই
f.course[0].checked = true;                // প্রথম checkbox-এ টিক
f.session.value = 'day';
f.note.value = 'Hostel lagbe';
f.addEventListener('submit', (e) => {
  e.preventDefault();                      // আসল সার্ভারে না পাঠিয়ে দেখি কী যেত
  for (const [k, v] of new FormData(f)) console.log(`${k}=${v}`);
  console.log('as GET:', f.getAttribute('action') + '?' + new URLSearchParams(new FormData(f)));
});
f.requestSubmit();                         // যেন দর্শক "জমা দিন" চাপলেন

প্রথম লাইন: empty form valid? false | problems: student_name, email, group — তিনটি required ঘর ফাঁকা; মোবাইল নম্বর ঐচ্ছিক, তাই ফাঁকা থাকলে pattern যাচাই হয় না। দ্বিতীয় লাইন: after first try: email, phone, group — নাম ঠিক হলো, কিন্তু ইমেইলে @ নেই আর নম্বর 01 দিয়ে শুরু নয়। এরপর সব ঠিক করে জমা দিলে সাতটি জোড়া আসে: student_name=Nusrat Jahan, email=nusrat@example.com, phone=01712345678, group=science, course=ict, session=day, note=Hostel lagbe. লক্ষ করুন — “বিজ্ঞান” বা “দিবা” নয়, যায় value; টিক না দেওয়া debate নেই; বোতাম দুটিরও name নেই, তাই তারাও নেই। শেষ লাইনে একই তথ্য GET ঠিকানা হলে কেমন হতো: /register?student_name=Nusrat+Jahan&email=nusrat%40example.com&…&note=Hostel+lagbe — ফাঁকা জায়গা +, @ হলো %40.

HTML validation নিরাপত্তা নয়। required, type, pattern সবই দর্শকের নিজের ব্রাউজারে চলে — আর ব্রাউজার দর্শকের নিয়ন্ত্রণে। যে কেউ DevTools খুলে (F12) attribute মুছে দিতে পারেন, জাভাস্ক্রিপ্ট বন্ধ করতে পারেন, বা কোনো ফর্ম ছাড়াই সরাসরি সার্ভারে অনুরোধ পাঠাতে পারেন। তাই ব্রাউজারের যাচাই দর্শকের সুবিধার জন্য — ভুল তাড়াতাড়ি ধরা পড়ে। নিরাপত্তার যাচাই সবসময় সার্ভারে: দৈর্ঘ্য, ধরন, অনুমতি, আর ক্ষতিকর ইনপুট (পর্ব ৪৩)। ফর্মের নিরাপত্তা আর জাভাস্ক্রিপ্ট দিয়ে উন্নত যাচাই দেখুন JavaScript কোর্সের ফর্ম ও validation পর্বে।

৬ · অন্য সাইটের জিনিস বসানো — iframe, audio আর video

স্কুলের যোগাযোগ পাতায় একটি মানচিত্র, বা পরিচিতি পাতায় অনুষ্ঠানের একটি ভিডিও — এগুলো নিজের সার্ভারে না রেখে অন্য সাইট থেকে বসানো যায়। iframe (inline frame) পাতার ভেতরে আরেকটি পূর্ণ ওয়েব-পাতার জানালা খোলে। Google Maps-এ “Share → Embed a map” বা YouTube-এ “Share → Embed” চাপলে ঠিক এমন একটি iframe-এর কোড পাওয়া যায়, শুধু কপি করে বসাতে হয়। নিজের অডিও-ভিডিও ফাইল হলে আছে <audio> আর <video> — ব্রাউজার নিজেই প্লে-বোতামসহ প্লেয়ার দেখায়।

<!-- Google Maps বা YouTube-এর "Embed" থেকে কপি করা কোডের ধাঁচ -->
<iframe src="https://www.youtube-nocookie.com/embed/VIDEO_ID"
        title="বার্ষিক সাংস্কৃতিক অনুষ্ঠান ২০২৬ — ভিডিও"
        width="560" height="315" loading="lazy" allowfullscreen></iframe>

<!-- নিজের ফাইল -->
<audio src="media/national-anthem.mp3" controls></audio>

<video src="media/science-fair.mp4" controls width="640" poster="img/fair-cover.jpg">
  <track kind="captions" src="media/science-fair-bn.vtt" srclang="bn" label="বাংলা">
  আপনার ব্রাউজার ভিডিও চালাতে পারে না — <a href="media/science-fair.mp4">ফাইলটি নামিয়ে নিন</a>.
</video>
  • controls দিলে প্লে, পজ, ভলিউম আসে; না দিলে ভিডিও থাকে কিন্তু চালানোর বোতাম থাকে না। শব্দসহ নিজে নিজে বেজে ওঠা (autoplay) ব্রাউজার সাধারণত আটকে দেয় — দর্শকও বিরক্ত হন।
  • <track> দিয়ে সাবটাইটেল বা ক্যাপশন যোগ হয় — শ্রবণপ্রতিবন্ধী দর্শকের জন্য, আর শব্দ বন্ধ রেখে ফোনে দেখা মানুষের জন্যও।
  • iframe-এ title দিন — screen reader এটি পড়ে বলে জানালাটি কিসের। চাইলে sandbox attribute দিয়ে ভেতরের পাতার ক্ষমতা সীমিত করা যায় — এই পর্বের “নিজে চালিয়ে দেখুন” বাক্সগুলোও এভাবে sandbox-করা iframe-এ চলে।

গোপনীয়তার কথা: iframe-এর ভেতরের পাতা আসে অন্য কোম্পানির সার্ভার থেকে। আপনার পাতা খোলামাত্র দর্শকের ব্রাউজার Google বা YouTube-এর সাথে যোগাযোগ করে — দর্শকের IP ঠিকানা, কোন পাতায় আছেন, আর তাদের cookie — সবই সেই কোম্পানি পায়, দর্শক ভিডিও না চালালেও। YouTube-এর “privacy-enhanced mode” (youtube-nocookie.com ঠিকানা) এই ট্র্যাকিং কমায়। স্বাস্থ্য বা আইনি পরামর্শের মতো সংবেদনশীল সাইটে এটি গুরুত্বপূর্ণ প্রশ্ন; পর্ব ৪৫-এ গোপনীয়তা নিয়ে বিস্তারিত। আর মনে রাখুন, অন্যের ভিডিও বা গান নিজের সার্ভারে তুলে দেওয়া কপিরাইটের প্রশ্ন — মালিকের দেওয়া embed কোডই নিরাপদ পথ।

৭ · সব মিলিয়ে — একটি ছোট স্কুল-ওয়েবসাইট

এবার এই পর্বের সব টুকরো জোড়া দিন। ধরুন “আদর্শ উচ্চ বিদ্যালয়” (কাল্পনিক) একটি ছোট static সাইট চায় — চারটি পাতা, একটি স্টাইল ফাইল, কয়েকটি ছবি। ফোল্ডারের গঠন:

school-site/
├── index.html        হোম: পরিচিতি, নোটিশ, ছবি
├── about.html        আমাদের সম্পর্কে: ইতিহাস, শিক্ষকদের টেবিল
├── routine.html      ক্লাস রুটিন (colspan/rowspan)
├── contact.html      যোগাযোগ: ভর্তির ফর্ম + মানচিত্র (iframe)
├── css/style.css     সব পাতার একই নকশা
└── img/logo.png, img/sports-day.jpg …

প্রতিটি পাতার ওপরে একই মেনু — এভাবেই চারটি আলাদা ফাইল একটি “সাইট” হয়ে ওঠে:

<header>
  <a href="index.html"><img src="img/logo.png" alt="আদর্শ উচ্চ বিদ্যালয় — হোম পেজ" width="120" height="40"></a>
  <nav>
    <a href="index.html">হোম</a>
    <a href="about.html">আমাদের সম্পর্কে</a>
    <a href="routine.html">ক্লাস রুটিন</a>
    <a href="contact.html#admission">ভর্তির আবেদন</a>
  </nav>
</header>

লক্ষ করুন: সব পাতা একই ফোল্ডারে, তাই লিংকগুলো শুধু ফাইলের নাম — সবচেয়ে সরল relative ঠিকানা। contact.html#admission অন্য পাতায় গিয়ে সরাসরি ফর্মের অংশে নামায় (অন্য পাতার bookmark). contact.html-এ থাকবে <form id="admission" action="..." method="post"> — ওপরের রেজিস্ট্রেশন ফর্মের মতো, প্রতিটি ঘরে label আর name সহ — আর তার নিচে মানচিত্রের iframe. ফর্মের action কোথায় যাবে? static হোস্টিংয়ে নিজের সার্ভার-প্রোগ্রাম নেই, তাই এমন সাইট সাধারণত কোনো ফর্ম-সেবা বা হোস্টের দেওয়া ফর্ম-ব্যবস্থা ব্যবহার করে; নিজের প্রোগ্রাম লিখতে হলে dynamic হোস্টিং লাগে (পর্ব ৩৪)।

প্রকাশের আগে নিজে একবার যাচাই করুন: প্রতিটি লিংকে চেপে দেখুন কোনোটি ভাঙা কি না; ব্রাউজারের জানালা সরু করে ফোনের মাপে দেখুন টেবিল আর ছবি পর্দার বাইরে যায় কি না; কিবোর্ডের Tab চেপে চেপে পুরো ফর্ম পূরণ করা যায় কি না; আর W3C-র বিনা খরচের HTML validator-এ (validator.w3.org) ফাইলগুলো পরীক্ষা করুন। এই সাইটটিই পর্ব ৫৫-এর ব্যবহারিক পরীক্ষার HTML অংশের ভালো প্রস্তুতি।

পরীক্ষা ও ইন্টারভিউতে — এ ধরনের প্রশ্ন প্রায়ই আসে:

  • হাইপারলিংক তৈরির ট্যাগ আর গন্তব্যের attribute কী? <a> ট্যাগ; গন্তব্য লেখা হয় href attribute-এ।
  • colspan আর rowspan-এর পার্থক্য? colspan একটি ঘরকে পাশাপাশি একাধিক কলাম জুড়ে বিস্তৃত করে; rowspan ওপর-নিচে একাধিক সারি জুড়ে।
  • টেবিলের হেডার ঘরের ট্যাগ কোনটি? cellpadding আর cellspacing-এর পার্থক্য? <th>. cellpadding ঘরের দেয়াল আর লেখার মাঝের ফাঁক; cellspacing দুই ঘরের মাঝের ফাঁক।
  • GET আর POST-এর পার্থক্য? GET তথ্য URL-এর query string-এ পাঠায় (দেখা যায়, bookmark করা যায়); POST অনুরোধের body-তে পাঠায় — পাসওয়ার্ড, বড় তথ্য আর ফাইলের জন্য।
  • img ট্যাগে alt-এর কাজ কী? ছবি না দেখা গেলে বা screen reader ব্যবহারকারীর জন্য ছবির বিকল্প লেখা; সার্চ ইঞ্জিনও এটি পড়ে।

আরও গভীরে: semantic HTML, CSS দিয়ে টেবিল আর ফর্ম সাজানো, Flexbox ও Grid দিয়ে পুরো পাতার বিন্যাস — ধাপে ধাপে শিখুন আমাদের HTML & CSS কোর্সে। আর ফর্মের তথ্য জাভাস্ক্রিপ্ট দিয়ে যাচাই, সুন্দর ভুলবার্তা, Constraint Validation API, আর কেন সার্ভারেই শেষ সিদ্ধান্ত — দেখুন JavaScript-এ ফর্ম ও validation পর্বে।

৮ · AI-এর যুগে — দশ সেকেন্ডে টেবিল আর ফর্ম, কিন্তু যাচাই আপনার

“একটি ক্লাস রুটিনের HTML টেবিল বানাও” বা “ভর্তির ফর্ম লিখে দাও” — AI চ্যাটবট কয়েক সেকেন্ডে কাজ চলার মতো কোড দেয়। এটি সত্যিই সময় বাঁচায়। কিন্তু AI-এর লেখা HTML-এ কিছু ভুল প্রায় নিয়মিত দেখা যায়: label নেই বা for-id মেলে না; ছবিতে alt="image"; th-এ scope নেই; পুরো পাতার নকশা টেবিল দিয়ে; রুটিনে rowspan দেওয়ার পরও নিচের সারিতে বাড়তি ঘর; name ছাড়া ঘর; আর সবচেয়ে বিপজ্জনক — “required দিয়েছি, তাই ফর্ম নিরাপদ” ধরনের দাবি। AI কখনো পুরোনো ধাঁচও দেয় (<center>, <font>, bgcolor). পরীক্ষার খাতায় পাঠ্যবইয়ের attribute লিখতে হতে পারে, কিন্তু নতুন সাইটে CSS-ই ঠিক পথ — দুটি আলাদা রাখুন।

নিচের prompt-টি কপি করে নিজের প্রয়োজন বসান। কোড চাওয়ার সাথে সাথে AI-কে নিজের কাজ যাচাই করতেও বলা হয়েছে:

আমার স্কুলের ওয়েবসাইটের জন্য [একটি ক্লাস রুটিনের টেবিল / একটি ভর্তির আবেদন ফর্ম] HTML-এ বানাও। তথ্য: [দিন, সময়, বিষয় / কোন কোন ঘর লাগবে]. নিয়ম: ১. টেবিলে caption, thead/tbody, আর th-এ scope দাও; জোড়া ঘরে colspan/rowspan দিলে প্রতিটি সারির ঘর গুনে দেখাও যে মোট কলাম মেলে। ২. ফর্মের প্রতিটি ঘরে label (for আর id মিলিয়ে) আর name দাও; radio-গুলো fieldset আর legend-এ রাখো। ৩. ছবি থাকলে অর্থবহ বাংলা alt দাও, সাজসজ্জার ছবিতে alt="" দাও। ৪. চেহারার জন্য পুরোনো attribute (border, bgcolor, cellpadding) নয়, আলাদা CSS দাও। ৫. শেষে স্পষ্ট করে বলো: এই ফর্মের HTML validation কোন কোন জিনিস ধরে, আর সার্ভারে কী কী আবার যাচাই করতে হবে।

AI-এর লেখা HTML ব্যবহারের আগে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। লিংক, ছবি, টেবিল আর ফর্ম — প্রতিটির পেছনে আছে স্বপ্ন, তর্ক আর আপসের গল্প।

প্র ০১ওয়েব আসার প্রায় অর্ধশতক আগে ১৯৪৫ সালে একজন বিজ্ঞানী লিংকের স্বপ্ন দেখেছিলেন, আর ১৯৬০-এর দশকে “hypertext” শব্দটি জন্মায়। তাহলে আজকের ওয়েব তাঁদের স্বপ্নের চেয়ে সরল কেন?

১৯৪৫ সালের জুলাইয়ে মার্কিন বিজ্ঞানী Vannevar Bush — দ্বিতীয় বিশ্বযুদ্ধে যুক্তরাষ্ট্রের বিজ্ঞান-গবেষণার প্রধান সমন্বয়ক — The Atlantic পত্রিকায় লেখেন “As We May Think”. তাঁর দুশ্চিন্তা ছিল, গবেষণার কাগজ এত দ্রুত বাড়ছে যে কেউ আর খুঁজে পাবে না। সমাধান হিসেবে তিনি কল্পনা করেন Memex — একটি টেবিলের মতো যন্ত্র, যার ভেতরে microfilm-এ রাখা হাজার হাজার বই আর নোট। আসল ধারণাটি ছিল “associative trail”: পাঠক দুটি দলিলকে একটি সুতোয় বেঁধে রাখতে পারবেন, পরে সেই সুতো ধরে ধরে আবার ফিরতে পারবেন — মানুষের মন যেভাবে এক চিন্তা থেকে আরেক চিন্তায় লাফায়। Memex কখনো তৈরি হয়নি, কিন্তু প্রবন্ধটি পরের প্রজন্মের কম্পিউটার-বিজ্ঞানীদের প্রেরণা হয়ে থাকে।

১৯৬০-এর দশকে Ted Nelson “hypertext” আর “hypermedia” শব্দ চালু করেন, আর শুরু করেন Project Xanadu. তাঁর নকশা ছিল অনেক উচ্চাভিলাষী: লিংক হবে দুই-মুখী (যে পাতায় লিংক এসেছে, সে-ও জানবে কে তাকে উদ্ধৃত করেছে), কোনো লিংক কখনো ভাঙবে না, প্রতিটি সংস্করণ রক্ষিত থাকবে, আর উদ্ধৃতি থেকে মূল লেখককে স্বয়ংক্রিয়ভাবে সম্মানী দেওয়া যাবে। ১৯৬৮ সালে Douglas Engelbart তাঁর বিখ্যাত প্রদর্শনীতে মাউস দিয়ে লিংকে ক্লিক করা দেখান। কিন্তু Xanadu দশকের পর দশক পূর্ণাঙ্গ রূপ পায়নি।

১৯৮৯ সালে CERN-এ Tim Berners-Lee যে প্রস্তাব দেন, তা ইচ্ছে করেই সরল: লিংক এক-মুখী, কোনো কেন্দ্রীয় তালিকা নেই, যে কেউ অনুমতি ছাড়াই যেকোনো পাতায় লিংক দিতে পারে — আর লিংক ভাঙলে শুধু একটি “404 Not Found”. Nelson এই সরলতার কড়া সমালোচক ছিলেন। কিন্তু ঠিক এই সরলতাই ওয়েবকে ছড়াতে দিয়েছে: কাউকে জিজ্ঞেস করতে হয় না, কোনো কেন্দ্রীয় ডেটাবেস আপডেট রাখতে হয় না। দাম দিতে হয়েছে ভাঙা লিংক (প্রশ্ন ৫) আর “কে আমাকে উদ্ধৃত করছে” জানার অক্ষমতায় — সেই অভাব পরে পূরণ করে সার্চ ইঞ্জিন, যারা পুরো ওয়েব পড়ে উল্টো দিকের লিংকগুলো গোনে।

মূল উপলব্ধি: নিখুঁত নকশা প্রায়ই জটিলতার ভারে আটকে যায়; যথেষ্ট-ভালো সরল নকশা ছড়িয়ে পড়ে, আর তার ঘাটতিগুলো পরে অন্য প্রযুক্তি পূরণ করে। <a href>-এর এক-মুখী সরলতা একটি সচেতন আপস।

প্র ০২ওয়েবে ছবি বসানোর <img> ট্যাগ এসেছিল একজন ছাত্রের একটি ইমেইল থেকে। একটি ছোট প্রস্তাব কীভাবে পুরো ওয়েবের চেহারা বদলে দিল?

১৯৯৩ সালের শুরুতে ওয়েব ছিল প্রায় পুরোপুরি লেখার জগৎ। ছবি দেখতে হলে লিংকে চেপে আলাদা প্রোগ্রামে ফাইল খুলতে হতো। যুক্তরাষ্ট্রের University of Illinois-এর NCSA গবেষণাকেন্দ্রে তখন একদল তরুণ Mosaic নামের একটি ব্রাউজার বানাচ্ছিলেন; তাঁদের একজন, স্নাতক পর্যায়ের ছাত্র Marc Andreessen. ১৯৯৩ সালের ফেব্রুয়ারিতে তিনি ওয়েব-নির্মাতাদের মেইলিং লিস্ট www-talk-এ একটি ছোট ইমেইলে প্রস্তাব দেন: একটি নতুন ট্যাগ IMG, যার SRC attribute-এ ছবির ঠিকানা থাকবে, আর ছবিটি লেখার মাঝেই দেখা যাবে।

আলোচনায় অন্যরা ভিন্ন পথ সুপারিশ করেছিলেন — Tim Berners-Lee সহ কেউ কেউ চাইছিলেন আরও সাধারণ কোনো ব্যবস্থা, যাতে ছবি ছাড়াও যেকোনো ধরনের জিনিস একইভাবে বসানো যায়, আর না দেখাতে পারলে বিকল্প লেখা থাকে। কিন্তু Andreessen-এর দল আলোচনা শেষ হওয়ার অপেক্ষা না করে Mosaic-এ IMG বানিয়ে ফেলে। ১৯৯৩ সালেই Mosaic Windows আর Mac-এর জন্য বেরোয়, আর ছবিসহ রঙিন পাতা দেখে সাধারণ মানুষ প্রথমবার ওয়েবে আকৃষ্ট হয়। যে ট্যাগ আগে চালু হয়, সেটিই মান হয়ে যায়। ১৯৯৪ সালে Andreessen সহ-প্রতিষ্ঠা করেন Netscape — ব্রাউজার যুদ্ধের সূচনা।

তাড়াহুড়োর দামও আছে। alt attribute পরে যোগ হয়, আর বহু বছর তা ঐচ্ছিক ধরে নিয়ে কোটি কোটি ছবি বর্ণনা ছাড়াই ওয়েবে উঠেছে — দৃষ্টিপ্রতিবন্ধী মানুষের কাছে সেই ছবিগুলো আজও অদৃশ্য। “আগে বানাও, পরে মান ঠিক করো” পদ্ধতিতে ওয়েব দ্রুত এগিয়েছে, কিন্তু এমন অনেক অসঙ্গতি রয়ে গেছে যা পরে আর বদলানো যায়নি, কারণ লাখো পাতা সেগুলোর ওপর নির্ভর করে।

মূল উপলব্ধি: প্রযুক্তির মান অনেক সময় কমিটিতে নয়, যে আগে কাজ করা জিনিস মানুষের হাতে দেয় তার হাতে ঠিক হয়। সেই গতির দাম মেটাতে হয় পরে — যেমন alt-এর অভাবের দাম মেটাচ্ছে accessibility-র দীর্ঘ লড়াই।

প্র ০৩১৯৯০-এর দশকে প্রায় সব সুন্দর ওয়েবসাইট টেবিল দিয়ে বানানো হতো। কেন, আর ২০০৩ সালের একটি ওয়েবসাইট কীভাবে ডিজাইনারদের মন বদলে দিল?

টেবিল এসেছিল বিজ্ঞানীদের তথ্য দেখানোর জন্য। কিন্তু ১৯৯০-এর দশকের মাঝামাঝি ব্রাউজারে টেবিল আসার পর ডিজাইনাররা আবিষ্কার করলেন, এটিই একমাত্র উপায় যা দিয়ে পাতায় কলাম বানানো যায় — বাঁয়ে মেনু, মাঝে লেখা, ডানে বিজ্ঞাপন। তখনকার CSS ছিল দুর্বল, আর ব্রাউজারভেদে আলাদা আচরণ করত। তাই টেবিলের ভেতরে টেবিল, তার ভেতরে আরও টেবিল; ফাঁকা জায়গা রাখতে ১×১ পিক্সেলের স্বচ্ছ “spacer GIF” ছবি; একটি ছবিকে কেটে বিশ টুকরো করে টেবিলের ঘরে ঘরে বসানো। পাতা দেখতে ঠিক, কিন্তু HTML দেখলে জঙ্গল।

সমস্যা ছিল অনেক। screen reader পুরো পাতাকে তথ্যের টেবিল ভেবে ঘর ধরে ধরে পড়ত — দৃষ্টিপ্রতিবন্ধী মানুষের জন্য বিভ্রান্তিকর। নকশায় সামান্য বদলেও প্রতিটি পাতার HTML নতুন করে লিখতে হতো। ফাইল ভারী হতো, ডায়াল-আপ সংযোগে ধীর। আর বিষয়বস্তু আর সাজসজ্জা এমনভাবে জট পাকিয়ে থাকত যে সার্চ ইঞ্জিনেরও বুঝতে কষ্ট হতো।

W3C ১৯৯৬ সালেই CSS-এর প্রথম সংস্করণ প্রকাশ করেছিল, মূল কথা ছিল: HTML বলবে কী, CSS বলবে কেমন। কিন্তু ব্রাউজারের সমর্থন ভালো হতে কয়েক বছর লেগে যায়, আর অনেক ডিজাইনার বিশ্বাসই করতেন না CSS দিয়ে সুন্দর নকশা সম্ভব। ২০০৩ সালে ডিজাইনার Dave Shea চালু করেন CSS Zen Garden — একটিমাত্র HTML পাতা, যার লেখা কখনো বদলায় না; সারা পৃথিবীর ডিজাইনাররা শুধু নিজের CSS ফাইল জমা দেন। ফলাফল চমকে দেওয়ার মতো: একই HTML কোথাও জাপানি চিত্রকলা, কোথাও পুরোনো পত্রিকা, কোথাও আধুনিক পোস্টার। প্রমাণ হয়ে গেল, সাজসজ্জা পুরোপুরি আলাদা রাখা যায়। এরপর ধীরে ধীরে টেবিল-নকশা বিদায় নেয়, আর পরে Flexbox ও Grid পাতার বিন্যাসকে সহজ করে দেয়।

মূল উপলব্ধি: ভালো টুলের অভাবে মানুষ অন্য কাজের টুল দিয়ে কাজ চালায় — আর সেই “চালাকি” পরে বড় বোঝা হয়ে দাঁড়ায়। বিষয়বস্তু আর উপস্থাপনা আলাদা রাখা — এই নীতি ওয়েব ছাড়িয়ে Word-এর style থেকে প্রোগ্রামিং পর্যন্ত সব জায়গায় খাটে।

প্র ০৪প্রথম দিকের ওয়েব শুধু পড়ার জিনিস ছিল। ১৯৯৩ সালে ফর্ম আর CGI এসে কীভাবে আজকের অনলাইন ব্যাংকিং, ই-কমার্স আর ওয়েব অ্যাপের দরজা খুলে দিল?

শুরুর ওয়েব ছিল একটি বিশাল লাইব্রেরি — আপনি পড়তে পারেন, কিছু লিখতে পারেন না। ১৯৯৩ সালের দিকে HTML-এ ফর্মের ট্যাগ যোগ হয় আর Mosaic সহ ব্রাউজারগুলো তা সমর্থন করতে শুরু করে। কিন্তু ফর্ম জমা দিলে সার্ভার তথ্যটি নিয়ে কী করবে? ওয়েব সার্ভার তো শুধু ফাইল পাঠাতে জানত। একই বছর NCSA-তে তৈরি হয় CGI (Common Gateway Interface) — একটি সাধারণ নিয়ম: অনুরোধ এলে সার্ভার একটি প্রোগ্রাম চালাবে, ফর্মের name=মান জোড়া তাকে দেবে, আর প্রোগ্রাম যা লিখবে তা-ই HTML পাতা হিসেবে দর্শকের কাছে যাবে।

এই ছোট নিয়মটি বিপ্লব ঘটায়। সার্ভারে cgi-bin নামের ফোল্ডারে রাখা Perl বা C প্রোগ্রাম দিয়ে তৈরি হলো অতিথি-খাতা, সার্চ-বাক্স, হিট-কাউন্টার। ১৯৯৫ সালের দিকে PHP-র মতো ভাষা আসে, যা HTML-এর মধ্যেই সার্ভার-কোড লেখা সহজ করে দেয়; একই সময়ে অনলাইন দোকান আর নিলামের সাইট চালু হয়। একই বছর Netscape-এ জাভাস্ক্রিপ্ট আসে — ফর্ম পাঠানোর আগেই ব্রাউজারে যাচাইয়ের সুযোগ। অনেক পরে, ২০১০-এর দশকে HTML5 type="email", date, required, pattern যোগ করে — যে যাচাই আগে জাভাস্ক্রিপ্ট লিখে করতে হতো, তা এক শব্দে।

আজ বাংলাদেশে বোর্ডের পরীক্ষার ফল দেখা, বিশ্ববিদ্যালয়ে ভর্তির আবেদন, বিদ্যুৎ বিল পরিশোধ, ট্রেনের টিকিট কাটা — সবকিছুর ভিত্তি সেই একই ধারণা: একটি ফর্ম, name=মান জোড়া, আর সার্ভারের একটি প্রোগ্রাম। এখনকার অ্যাপ প্রায়ই জাভাস্ক্রিপ্ট দিয়ে পাতা না বদলেই তথ্য পাঠায়, কিন্তু ভেতরের HTTP অনুরোধের গঠন প্রায় একই। CGI-এর যুগ থেকে একটি শিক্ষাও রয়ে গেছে: দর্শকের পাঠানো তথ্য যাচাই না করে প্রোগ্রামে ব্যবহার করলে সার্ভার দখল হয়ে যেতে পারে — প্রথম দিকের অনেক হ্যাকিং ঠিক এই পথেই হয়েছিল।

মূল উপলব্ধি: ফর্ম আর একটি সরল “প্রোগ্রাম চালাও, আউটপুট পাঠাও” নিয়ম মিলে ওয়েবকে লাইব্রেরি থেকে কর্মক্ষেত্রে বদলে দিয়েছে। আর যেদিন দর্শক তথ্য পাঠাতে পারলেন, সেদিন থেকেই “বাইরের তথ্য বিশ্বাস করবেন না” নিরাপত্তার প্রথম নিয়ম হয়ে গেল।

প্র ০৫দশ বছর আগের একটি সংবাদের লিংকে চাপলে প্রায়ই “404” বা অন্য কিছু আসে। লিংক কেন ভাঙে, আর ১৯৯৬ সালে শুরু হওয়া Internet Archive কীভাবে ওয়েবের স্মৃতি বাঁচাচ্ছে?

ওয়েবের লিংক এক-মুখী (প্রশ্ন ১): যে পাতা লিংক দিয়েছে, সে জানে না গন্তব্যে কী ঘটছে। গন্তব্যের মালিক পাতা মুছে দেন, সাইটের নকশা বদলে ঠিকানার কাঠামো পাল্টান, প্রতিষ্ঠান বন্ধ হয়ে যায়, ডোমেইনের মেয়াদ ফুরায় (পর্ব ৩৪) আর অন্য কেউ সেটি কিনে নেয়। ফলে পুরোনো লিংক হয় “404 Not Found” দেখায়, নয়তো সম্পূর্ণ ভিন্ন — কখনো প্রতারণার — পাতায় নিয়ে যায়। একে বলে link rot. বিভিন্ন গবেষণায় বারবার দেখা গেছে, এক দশকের মধ্যে ওয়েব-পাতার বড় একটি অংশ আর আগের ঠিকানায় পাওয়া যায় না; আদালতের রায় আর গবেষণাপত্রে উদ্ধৃত লিংকও এর বাইরে নয়।

১৯৯৮ সালে Tim Berners-Lee একটি ছোট লেখায় লিখেছিলেন, “Cool URIs don't change” — ভালো ঠিকানা কখনো বদলায় না। পরামর্শটি সরল: ঠিকানায় প্রযুক্তি বা সাময়িক জিনিস রাখবেন না, আর পাতা সরালে পুরোনো ঠিকানা থেকে নতুনটিতে স্থায়ী redirect (301) দিন। এই ABCL TECH সাইটও ফাইলের নাম বদলালে পুরোনো ঠিকানাগুলো redirect দিয়ে বাঁচিয়ে রাখে।

অন্যদিক থেকে সমাধানে নামেন Brewster Kahle. ১৯৯৬ সালে তিনি অলাভজনক Internet Archive শুরু করেন — একটি ডিজিটাল গ্রন্থাগার, যার প্রোগ্রাম নিয়মিত ওয়েব ঘুরে পাতার কপি জমিয়ে রাখে। ২০০১ সাল থেকে Wayback Machine দিয়ে যে কেউ একটি ঠিকানা লিখে দেখতে পারেন বিভিন্ন তারিখে পাতাটি কেমন ছিল; “Save Page Now” দিয়ে নিজেও কোনো পাতার কপি রাখতে বলতে পারেন। সাংবাদিক, গবেষক, আইনজীবী — সবাই এর ওপর নির্ভর করেন। তবু সীমা আছে: লগইনের পেছনের পাতা, জাভাস্ক্রিপ্ট-নির্ভর অ্যাপ আর সামাজিক মাধ্যমের অনেক কিছু ঠিকমতো সংরক্ষণ হয় না, আর কপিরাইট নিয়ে আইনি লড়াইও চলেছে।

মূল উপলব্ধি: লিংক একটি প্রতিশ্রুতি — “এই ঠিকানায় এটি পাবেন”। নিজের সাইটে ঠিকানা স্থির রাখা, পুরোনো ঠিকানা redirect করা, আর গুরুত্বপূর্ণ উৎসের সংরক্ষিত কপি রাখা — এগুলো সেই প্রতিশ্রুতি রক্ষার উপায়।

অনুশীলন

প্রথমটি খাতা-কলমে, দ্বিতীয়টিতে একটু HTML লেখা, তৃতীয়টি নিজের কম্পিউটারে পর্যবেক্ষণ, চতুর্থটি লেখা সংশোধন।

  1. ঠিকানা মেলান: পাতাটি আছে https://shop.example/store/products/shirt.html-এ। এই চারটি href কোথায় নিয়ে যাবে? (ক) ../cart.html (খ) images/s1.jpg (গ) /index.html (ঘ) ../../about.html

    বর্তমান ফোল্ডার /store/products/. (ক) এক ধাপ ওপরে /store/ → https://shop.example/store/cart.html. (খ) ভেতরের ফোল্ডারে → https://shop.example/store/products/images/s1.jpg. (গ) গোড়া থেকে → https://shop.example/index.html. (ঘ) দুই ধাপ ওপরে, গোড়ায় → https://shop.example/about.html. গোড়ার ওপরে আর ওঠা যায় না — ../../../about.html লিখলেও ফল একই হতো।

  2. ফলাফলের টেবিল: একটি টেবিল লিখুন — ওপরের সারিতে “রোল”, “নাম” আর “নম্বর”; “নম্বর”-এর নিচে দুটি কলাম “বাংলা” আর “ICT”. অর্থাৎ শিরোনাম দুই সারির। caption আর scope দিন। কোন ঘরে colspan আর কোন ঘরে rowspan লাগবে?

    “রোল” আর “নাম” দুই সারি উঁচু (rowspan="2"), “নম্বর” দুই কলাম চওড়া (colspan="2"):

    <table><caption>পরীক্ষার ফল</caption>
    <thead><tr><th rowspan="2" scope="col">রোল</th><th rowspan="2" scope="col">নাম</th><th colspan="2" scope="colgroup">নম্বর</th></tr>
    <tr><th scope="col">বাংলা</th><th scope="col">ICT</th></tr></thead>
    <tbody><tr><td>1</td><td>তানিয়া</td><td>85</td><td>92</td></tr></tbody></table>

    যাচাই: দ্বিতীয় শিরোনাম-সারিতে মাত্র দুটি ঘর, কারণ প্রথম দুটি কলাম ওপরের rowspan দখল করেছে; মোট কলাম সব সারিতে ৪। কয়েকটি কলামের ওপরের শিরোনামে scope="colgroup".

  3. validation এড়িয়ে দেখুন (শুধু নিজের ফাইলে): ওপরের রেজিস্ট্রেশন ফর্মের মতো একটি ছোট ফর্ম নিজের কম্পিউটারে test.html নামে রাখুন, যেখানে ইমেইলের ঘরে required আছে। ব্রাউজারে খুলে ফাঁকা অবস্থায় জমা দিন। তারপর F12 চেপে DevTools খুলুন, Elements অংশে ঘরটি খুঁজে required মুছে দিন, আবার জমা দিন। কী হলো, আর এ থেকে কী শিখলেন?

    প্রথমবার ব্রাউজার থামিয়ে দেয় আর ঘরের পাশে “এই ঘরটি পূরণ করুন” ধরনের বার্তা দেখায়। attribute মুছে দেওয়ার পর ফর্ম কোনো বাধা ছাড়াই জমা হয় — ঠিকানা-বারে ?email= (ফাঁকা মান) দেখতে পাবেন, যদি method get হয়। শিক্ষা: HTML-এর যাচাই দর্শকের নিজের যন্ত্রে চলে, আর দর্শক চাইলে তা বদলাতে পারেন। তাই সার্ভারে আবার যাচাই করতেই হবে। (এই পরীক্ষা কেবল নিজের ফাইলে করুন; অন্যের সাইটে ইচ্ছাকৃত ভুল তথ্য পাঠানো অনৈতিক এবং আইনের দৃষ্টিতে অপরাধ হতে পারে।)

  4. নোটিশ বোর্ড সংশোধন: একটি স্কুল-সাইটের নোটিশ অংশে আছে — “ভর্তির ফর্ম পেতে এখানে ক্লিক করুন। রুটিন দেখতে এখানে। ছবি: <img src="IMG_2041.jpg">”. লিংকের লেখা আর ছবির কোড ঠিক করে লিখুন।

    লিংক: <a href="files/admission-form.pdf">ভর্তির আবেদন ফর্ম (PDF)</a> নামিয়ে নিন; <a href="routine.html">দশম শ্রেণির ক্লাস রুটিন</a> দেখুন। ছবি: <img src="img/prize-giving-2026.jpg" alt="বার্ষিক পুরস্কার বিতরণীতে প্রধান শিক্ষক শিক্ষার্থীদের হাতে সনদ দিচ্ছেন" width="800" height="533">. ফাইলের নামও অর্থবহ করা হলো, alt ছবির বিষয় বলে, আর মাপ দেওয়ায় পাতা লাফায় না।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি ওয়েব ফর্ম জমা দিলে কী কী ঘটে — প্রথম থেকে শেষ সাজান (▲▼ চেপে সরান)

  1. ✍️ দর্শক ঘরগুলো পূরণ করে “জমা দিন” চাপেন
  2. 🔎 ব্রাউজার required, type, pattern যাচাই করে
  3. 🧾 প্রতিটি name-যুক্ত ঘর থেকে name=মান জোড়া তৈরি ও এনকোড হয়
  4. 📮 GET-এ URL-এর পেছনে বা POST-এ body-তে তথ্য action-এর ঠিকানায় যায়
  5. 🖥️ সার্ভার আবার যাচাই করে, সংরক্ষণ করে আর উত্তর-পাতা পাঠায়

HTML-এ হাইপারলিংকের গন্তব্য ঠিকানা কোন attribute-এ লেখা হয়?

  • src
  • href
  • alt
  • link

HTML টেবিলে একটি ঘরকে পাশাপাশি তিনটি কলাম জুড়ে বিস্তৃত করতে কোনটি লিখতে হয়?

  • rowspan="3"
  • cellspacing="3"
  • colspan="3"
  • cellpadding="3"

img ট্যাগে alt attribute-এর প্রধান উদ্দেশ্য কী?

  • ছবির প্রস্থ ও উচ্চতা ঠিক করা
  • মাউস রাখলে ছোট টিপ দেখানো
  • ছবির ফাইল কোথায় আছে তা বলা
  • ছবি দেখা না গেলে বা screen reader-এর জন্য ছবির বিকল্প লেখা দেওয়া

লগইন ফর্মে পাসওয়ার্ড পাঠাতে form-এর method হিসেবে কোনটি উপযুক্ত, এবং কেন?

  • POST — তথ্য URL-এ না বসে অনুরোধের body-তে যায়
  • GET — কারণ এটি দ্রুত আর bookmark করা যায়
  • POST — কারণ POST নিজেই তথ্য এনক্রিপ্ট করে
  • GET — কারণ ব্রাউজার GET-এর তথ্য লুকিয়ে রাখে

একটি ফর্মের ঘরে required আর pattern attribute দেওয়া আছে। সার্ভারের প্রোগ্রাম সম্পর্কে কোন কথাটি ঠিক?

  • ব্রাউজার যাচাই করেছে, তাই সার্ভারকে আর যাচাই করতে হবে না
  • pattern থাকলে তথ্য এনক্রিপ্ট হয়ে যায়, তাই নিরাপদ
  • সার্ভারকে সব তথ্য আবার যাচাই করতে হবে, কারণ ব্রাউজারের যাচাই এড়ানো যায়
  • required থাকলে সার্ভারে যাচাই করা নিষেধ

https://school.example/site/pages/about.html পাতায় href="../index.html" লিংকটি কোন ঠিকানায় নিয়ে যাবে?

  • https://school.example/site/pages/index.html
  • https://school.example/index.html
  • https://school.example/site/pages/../index
  • https://school.example/site/index.html

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. লিংক = <a href>: অন্য সাইটে absolute URL, নিজের সাইটে relative; ../ এক ফোল্ডার ওপরে, / দিয়ে শুরু মানে সাইটের গোড়া। প্রকার: internal, external, bookmark (#id), email (mailto:). লিংকের লেখা একা পড়লেও যেন অর্থ বোঝা যায়।
  2. ছবি = <img src alt width height>: ছবিতে JPEG/WebP, লোগোতে PNG বা SVG; alt অর্থবহ, সাজসজ্জায় ফাঁকা; ক্যাপশন চাইলে figure-figcaption.
  3. টেবিল = table, tr, th, td (+ caption, thead, tbody, tfoot); colspan আড়াআড়ি, rowspan খাড়া জোড়া; cellpadding ভেতরের ফাঁক, cellspacing ঘরে ঘরে ফাঁক — আজ CSS দিয়ে। পাতার বিন্যাসে টেবিল নয়।
  4. ফর্ম পাঠায় শুধু name=মান জোড়া, action-এর ঠিকানায়; GET-এ URL-এ (খোঁজার জন্য), POST-এ body-তে (পাসওয়ার্ড, নিবন্ধন, ফাইল)। প্রতিটি ঘরে label আর name.
  5. ব্রাউজারের validation সুবিধা, নিরাপত্তা নয় — সার্ভারে আবার যাচাই। iframe দিয়ে মানচিত্র-ভিডিও বসালে সেই সাইট দর্শকের তথ্য পায়; audio-video-তে controls আর ক্যাপশন দিন।

পরের পর্বে: এ পর্যন্ত আপনি HTML দিয়ে সাজিয়েছেন — কিন্তু ফর্ম জমা দিলে সার্ভারে যে প্রোগ্রাম তথ্য যাচাই করে, সে কীভাবে লেখা হয়? পরের পর্বে প্রোগ্রামিংয়ের জগতে ঢুকবেন: প্রোগ্রামিং ভাষা কী, compiler আর interpreter কীভাবে অনুবাদ করে, আর অ্যালগরিদম ও ফ্লোচার্ট দিয়ে সমস্যা সমাধানের পরিকল্পনা।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান