บทนำ
บทความนี้ให้ภาพรวมครบครันของการเพิ่ม JavaScript ลงใน HTML files รายละเอียด 3 core methods: วาง scripts inline ใน <head>, inline ใน <body>, และ link ไป external .js files นอกจาก 'how' บทความนี้ลึกเข้าไปใน 'why' สำคัญ อธิบาย performance implications ของแต่ละ approach รวมถึง concepts เช่น render-blocking, browser caching, และการใช้ modern attributes อย่าง defer และ async
เพื่อเชื่อม theory และ practice tutorial รวม practical real-world examples อย่างการสร้าง dark mode toggle และ validate web form สุดท้ายจะ equip คุณด้วย essential best practices สำหรับเขียน clean maintainable code และ troubleshooting guide ช่วยแก้ common beginner errors ด้วย browser's developer console เพื่อให้คุณเริ่ม web development projects ด้วยความมั่นใจ
ต้อง deploy JavaScript project เร็ว? เช็ก DigitalOcean App Platform และ deploy JS project จาก GitHub ในไม่กี่นาที
สรุปสำคัญ (Key Takeaways)
- Best practice สำหรับเพิ่ม JavaScript คือใช้ external
.jsfile เพื่อ better organization, maintenance, และ reusability - วาง
<script>tags ใน<head>แย่ที่สุดสำหรับ performance เพราะ render-blocking บังคับให้ users เห็น blank page - ใช้
deferattribute บน external scripts เป็น recommended modern approach สำหรับ optimal performance - External JavaScript files ให้ performance boost มากผ่าน browser caching ซึ่ง inline scripts ไม่มี
- Single
.jsfile link ได้หลายหน้า ทำให้ updates และ maintenance efficient มากขึ้น - Developer Console (F12) เป็น tool สำคัญที่สุดสำหรับ troubleshoot common JavaScript errors
วิธี 1: เพิ่ม Inline Script ใน <head>
คุณเพิ่ม JavaScript code ใน HTML document ได้ด้วย dedicated HTML tag <script> ที่ wrap around JavaScript code <script> tag วางได้ใน <head> section หรือ <body> section ขึ้นอยู่กับเมื่อไหร่คุณต้องการให้ JavaScript load
โดยทั่วไป JavaScript code วางใน document <head> section เพื่อเก็บไว้ให้ contained และไม่อยู่ใน main content ของ HTML document
พิจารณา basic HTML document ต่อไปนี้ พร้อม browser title Today's Date:
index.html
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Today's Date</title> </head> <body> </body> </html>
เพื่อเพิ่ม script สร้าง alert เราเพิ่ม <script> tag และ JavaScript code ใต้ <title> tag:
index.html
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Today's Date</title> <script> let d = new Date(); alert("Today's date is " + d); </script> </head> <body> </body> </html>
การวาง script ที่นี่ส่งสัญญาณให้ browser parse และ execute JavaScript ก่อนเริ่ม render content ใน <body> ของ page
Approach นี้เหมาะที่สุดสำหรับ scripts ที่ไม่ต้อง interact กับ elements บน page โดยตรง เมื่อ script ใน <head> รัน browser ยังไม่ได้ build Document Object Model (DOM) สำหรับ <body> หมายถึง HTML elements เช่น headings, paragraphs, หรือ divs ยังไม่มีอยู่ โค้ดที่พยายามหาหรือ modify elements เหล่านี้ (เช่นใช้ document.getElementById()) จะ fail วิธีนี้จึง ideal สำหรับ setup functions และ variables สำหรับใช้ภายหลัง หรือ include third-party analytics scripts ที่ต้อง load เร็วที่สุด
โหลดหน้าแล้วคุณจะได้ alert ประมาณนี้:

วิธี 2: เพิ่ม Inline Script ใน <body>
<script> tag วางใน <body> section ได้อีกด้วย เมื่อ script วางที่นี่ HTML parser จะ pause การทำงานเพื่อ execute script ที่จุดที่มันปรากฏใน document นี่คือวิธีที่ required สำหรับ JavaScript code ที่ต้อง find และ modify HTML element ทันที
Common best practice คือวาง scripts ก่อน closing </body> tag ตรงๆ วางที่นี่ ensure ว่า HTML elements ทั้งหมดบนหน้า parsed แล้วและ available ใน DOM ก่อน script เริ่มรัน มันยัง improve perceived page performance เพราะ browser render visible text และ images ทั้งหมดก่อน ให้ user เห็น page content ก่อน JavaScript ที่อาจใช้เวลานาน execute นี่ทำให้ content แสดงโดยไม่ถูก block โดย JavaScript execution
มาใช้วิธีนี้เขียน date ลง HTML body โดยตรง
index.html
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Today's Date</title> </head> <body> <script> let d = new Date(); document.body.innerHTML = "<h1>Today's date is " + d + "</h1>" </script> </body> </html>
Output สำหรับ HTML document ข้างบนที่โหลดผ่าน web browser จะคล้ายกับ:

Scripts ที่เล็กหรือรันแค่หน้าเดียว ใช้งานได้ดีภายใน HTML file แต่สำหรับ larger scripts หรือ scripts ที่ใช้หลายหน้า ไม่ใช่ effective solution เพราะ include แล้ว unwieldy หรือยากต่อการอ่าน/เข้าใจ ในส่วนต่อไป เราจะไป over วิธีจัดการ separate JavaScript file ใน HTML document
วิธี 3: ทำงานกับ Separate JavaScript File
สำหรับ larger scripts หรือ code ที่ต้องใช้ข้ามหลายหน้า effective และ professional solution ที่สุดคือวาง JavaScript ใน separate file ด้วย extension .js คุณ link ไป external file นี้จาก HTML โดยใช้ <script> tag พร้อม attribute src (source)
Benefits ของ approach นี้ significant มาก:
- Separation of Concerns: แยก HTML สำหรับ structure, CSS สำหรับ styling, และ JavaScript สำหรับ interactivity ออกเป็น separate files ทำให้ project cleaner, organized มากขึ้น และ debug ง่ายขึ้น
- Reusability และ Maintenance: Single script file เช่น
main-navigation.jslink ได้จากทุกหน้าของ website ถ้าต้อง update navigation logic คุณ edit เพียง single file นั้น - Browser Caching: เมื่อ user visit site ครั้งแรก browser download .js file ใน subsequent visits หรือ navigate ไปหน้าอื่นที่ใช้ file เดียวกัน browser จะใช้ stored (cached) copy แทน download ใหม่ ปรับปรุง loading times มาก
เพื่อ demonstrate การ connect JavaScript document กับ HTML document มาสร้าง small web project ประกอบด้วย script.js ใน directory js/, style.css ใน css/ และ main index.html ใน root ของ project
project/ ├── css/ | └── style.css ├── js/ | └── script.js └── index.html
มา move JavaScript code ที่แสดง date เป็น <h1> header ไป script.js file:
script.js
let d = new Date(); document.body.innerHTML = "<h1>Today's date is " + d + "</h1>"
ต่อมา edit style.css file ด้วยการเพิ่ม background color และ style ให้ <h1> header:
style.css
body { background-color: #0080ff; } h1 { color: #fff; font-family: Arial, Helvetica, sans-serif; }
สุดท้าย reference ทั้ง script และ stylesheet จาก index.html เราใช้ <link> tag ใน <head> สำหรับ CSS และ <script> tag พร้อม src attribute ใน <body> สำหรับ JavaScript
index.html
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Today's Date</title> <link rel="stylesheet" href="css/style.css"> </head> <body> <script src="js/script.js"></script> </body> </html>
ตอนนี้ JavaScript และ CSS ในที่ project organized มากขึ้น โหลด index.html page ใน web browser ควรเห็น styled page พร้อม current date คล้ายกับ:

ตอนนี้เราวาง JavaScript ใน file แล้ว เราเรียกได้เหมือนเดิมจาก additional web pages และ update ทั้งหมดใน single location วิธีนี้ให้ most organized และ scalable way จัดการ JavaScript ใน web projects ของคุณ สำหรับ control เพิ่มเติมเกี่ยวกับการ load external scripts คุณดู async และ defer attributes บน <script> tag ได้
Real-world examples มีอะไรบ้าง?
มาดู real-world examples บนสิ่งที่เราเรียนรู้ไปแล้ว
1. Simple Dark Mode Toggle
เกือบทุก modern website/app เสนอ dark mode สามารถทำได้โดย toggle CSS class ด้วย JavaScript
HTML:
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Dark Mode</title> <link rel="stylesheet" href="css/style.css"> </head> <body> <button id="theme-toggle">Toggle Dark Mode</button> <h1 id="title">DigitalOcean</h1> <p>This is some example text on the page.</p> <script src="js/script.js"></script> </body> </html>
CSS:
/* This class will be added or removed by JavaScript */ .dark-mode { background-color: #222; color: #eee; }
JavaScript:
const toggleButton = document.getElementById('theme-toggle'); toggleButton.addEventListener('click', function() { document.body.classList.toggle('dark-mode'); });
JavaScript หา button ผ่าน ID แล้ว attach event listener รอ click เมื่อ button ถูกคลิก classList.toggle('dark-mode') รัน ถ้า <body> ไม่มี class .dark-mode JavaScript เพิ่มมัน ถ้ามีอยู่แล้ว JavaScript ลบมัน Browser ใช้ CSS styles ที่ associated กับ class นั้นทันที
2. Basic Form Validation
Websites ต้อง ensure users fill out forms ถูกต้องก่อน submit JavaScript check ได้ทันทีโดยไม่ต้อง reload page
HTML:
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Form Validator</title> </head> <body> <form id="contact-form"> <label for="email">Email:</label> <input type="text" id="email" placeholder="you@example.com"> <button type="submit">Subscribe</button> <p id="error-message" style="color: red;"></p> </form> <script src="js/script.js"></script> </body> </html>
JavaScript:
const contactForm = document.getElementById('contact-form'); const emailInput = document.getElementById('email'); const errorMessage = document.getElementById('error-message'); contactForm.addEventListener('submit', function(event) { if (!emailInput.value.includes('@')) { event.preventDefault(); errorMessage.textContent = 'Please enter a valid email address.'; } else { errorMessage.textContent = ''; } });
Script listen สำหรับ submit event บน form เมื่อคลิกปุ่ม "Subscribe" function รัน ตรวจสอบก่อนว่า text ใน email input มี @ symbol หรือไม่
- ถ้าไม่มี
event.preventDefault()หยุด default submission behavior ของ form แล้วแสดง error message ที่ helpful ให้ user - ถ้ามี script ไม่ทำอะไร form submit ตามปกติ
Performance considerations สำหรับแต่ละ method คืออะไร?
มาพูดถึง key performance considerations สำหรับแต่ละ JavaScript loading method ที่พูดถึง:
Inline Script ใน <head>
Primary Issue: Render-Blocking
วาง script ใน
<head>มี negative impact มากที่สุดต่อ performance Browser ต้อง download, parse, และ execute JavaScript ก่อนจะ render ส่วนใดส่วนหนึ่งของ page's<body>ถ้า script ใหญ่หรือรันช้า user จะมอง blank white page จน script จบ เพิ่ม time to First Contentful Paint (FCP) critical user experience metricCaching: None
Inline scripts เป็นส่วนของ HTML document เอง ไม่สามารถ cached แยกต่างหากโดย browser ทุกครั้งที่ user visit page script re-downloaded และ re-parsed พร้อม HTML ทั้งหมด
วิธีนี้โดยทั่วไปแย่ที่สุดสำหรับ performance ควรหลีกเลี่ยง เว้นแต่ script เล็กมากและต้อง run ก่อนอะไรก็ตาม
Inline Script ใน <body>
Primary Issue: Partial Render-Blocking
วิธีนี้ major improvement over วาง scripts ใน
<head>Browser parse และ render HTML จนกว่าจะเจอ<script>tag ที่จุดนั้นหยุด render เพื่อ execute script โดยวาง script ท้าย<body>(ก่อน</body>tag) คุณ allow entire visible page rendered ก่อนCaching: None
เหมือน scripts ใน
<head>inline scripts ใน<body>เป็นส่วนของ HTML และไม่สามารถ cached แยกต่างหากได้
วาง script ท้าย body เป็น good strategy สำหรับ improve perception of speed เพราะ content visible เร็ว แต่ยัง delay page จากการเป็น fully interactive ได้
External JavaScript File
วิธีนี้ให้ flexibility มากที่สุดและ performance ดีที่สุด 主要因由 two factors: browser caching และ special loading attributes
Primary Advantage: Caching และ Asynchronous Loading
Caching: นี่คือ biggest performance win External
.jsfile download ครั้งเดียว first visit สำหรับ subsequent pages ที่ใช้ script เดียวกัน browser load file จาก local cache แทน network delay speed up site significantlydeferและasyncAttributes: External scripts unlock สอง powerful attributes<script defer src="..."></script>: บอก browser download script ใน background ขณะ parse HTML ต่อ script execute หลัง entire document parsed แล้ว นี่คือ recommended modern approach เพราะ non-blocking และ guarantee script runs in order ที่ปรากฏใน HTML<script async src="..."></script>: Download ใน background ไม่ block rendering เช่นกัน แต่ execute script ทันทีที่ download เสร็จ อาจเกิดขึ้นเวลาไหนก็ได้และอาจ interrupt rendering เหมาะสำหรับ independent third-party scripts (เช่น ads หรือ analytics) ที่ execution order ไม่สำคัญ
ใช้ external file linked ด้วย defer attribute เป็น best practice สำหรับ optimal performance รวม benefits ของ non-blocking loading กับ powerful browser caching
Best practices บางอย่างคืออะไร?
นี่คือ essential best practices และ troubleshooting tips สำหรับทำงานกับ JavaScript ใน HTML files
- Keep JavaScript in External Files: ชอบ link ไป
.jsfile (<script src="..."></script>) แทนเขียน JavaScript โดยตรงใน HTML เก็บ code organized, maintain ง่าย และ browser cache file สำหรับ faster loading - Load Scripts at the End of
<body>withdefer: สำหรับ best user experience วาง<script>tags ก่อน closing</body>tag และเพิ่มdeferattribute นี่ ensure page content load และ display เร็วโดยไม่ถูก block โดย JavaScript - Write Readable Code: ใช้ clear descriptive names สำหรับ variables และ functions (เช่น
calculateTotalPriceแทนcalc) ใช้ comments//อธิบาย why you wrote code ไม่ใช่ what it does - Don't Repeat Yourself (DRY): ถ้าพบว่าตัวเองเขียน same lines of code หลายที่ ให้ wrap code นั้นใน function เรียก function นั้นเมื่อต้องการ ทำให้ code สั้นและ update ง่าย
Common issues และ troubleshooting ยังไง?
ตอน script ไม่ work อย่า panic! Browser's Developer Tools คือเพื่อนสนิท กด F12 (หรือ right-click page เลือก "Inspect") และคลิก tab "Console" Errors ส่วนใหญ่จะปรากฏที่นี่ในสีแดง
Error: "Cannot read properties of null" หรือ "is not defined"
- Meaning: JavaScript พยายาม access HTML element ที่ยังไม่ loaded
- Solution: เกือบจะหมายถึง
<script>tag อยู่ใน<head>หรือสูงเกินไปใน<body>ย้าย script ไปท้าย<body>และเพิ่ม defer attribute
Error: "Uncaught SyntaxError"
- Meaning: คุณมี typo ใน code
- Solution: Console มักให้ line number ดูบรรทัดนั้นใกล้ชิดหา missing parentheses
(), curly braces{}, quotes"", หรือ typos อื่นๆ
Problem: Script ไม่รัน ไม่มี error ใน Console
- Meaning: HTML file ของคุณหา
.jsfile ไม่เจอ - Solution: Check tab "Network" ใน Developer Tools ถ้าเห็น script file listed with 404 error file path ใน
srcattribute ผิด ตรวจสอบ spelling และ folder structure (เช่น<script src="js/script.js"></script>)
- Meaning: HTML file ของคุณหา
Problem: Code รันแต่ไม่ทำสิ่งที่คาดหวัง
Meaning: นี่คือ logic error Syntax ถูกต้องแต่ steps ผิด
Solution: ใช้
console.log()debug วางใน code print ค่าของ variables ต่าง stages ช่วย trace logic และเห็นจุดที่ผิดlet userRole = 'guest'; console.log('User role before check:', userRole); // See what the value is if (userIsAdmin) { userRole = 'admin'; }
Frequently Asked Questions (FAQs)
1. วิธีที่ดีที่สุดเพิ่ม JavaScript ใน HTML file คืออะไร?
วิธีที่ดีที่สุดคือ link ไป external .js file พร้อม defer attribute วาง script tag ก่อน closing </body> tag (เช่น <script src="path/to/script.js" defer></script>)
2. ควรใส่ JavaScript ใน head หรือ body?
คุณควรใส่ JavaScript <script> tags ท้าย <body> section ก่อน closing </body> tag เสมอ
วาง scripts ใน <head> block page rendering ผู้ใช้เห็น blank white page จน scripts downloaded และ executed เสร็จ วาง scripts ท้าย <body> browser render HTML และ CSS ทั้งหมดก่อน ผู้ใช้เห็น content เร็วกว่ามาก
3. ใส่ multiple script tags ใน HTML file เดียวได้ไหม?
ได้ คุณ include <script> tags หลายตัวใน single HTML file ได้เท่าไหร่ก็ตาม Browser download และ execute ตามลำดับที่ปรากฏใน document
มักใช้ load third-party libraries ก่อน custom scripts ที่ depend on them
<body> <script src="library.js"></script> <script src="my-app.js"></script> </body>
4. ความแตกต่างหลักระหว่าง async และ defer คืออะไร?
ทั้งสอง attributes load scripts โดยไม่ block page rendering ความแตกต่างคือ defer guarantee scripts execute in order ที่ปรากฏหลัง document parsed fully ในขณะที่ async execute script ทันทีที่ downloaded เสร็จ ซึ่งอาจเป็น any order
5. Debug JavaScript ที่ไม่ทำงาน ยังไง?
เปิด browser Developer Tools (F12) check tab Console สำหรับ error messages ใช้ tab Network verify file loading และเพิ่ม console.log() statements trace variable values
สรุป
ในบทช่วยสอนนี้ คุณเรียนรู้ 3 core methods เพิ่ม JavaScript ใน HTML: inline ใน <head>, inline ใน <body>, และ link ไป external .js file คุณสำรวจ performance implications รวมถึง render-blocking, browser caching, และ defer/async attributes พร้อม real-world examples และ troubleshooting guide ใช้ Developer Console
ตอนนี้คุณเลือก JavaScript loading strategy ที่เหมาะสมกับ use case เขียน clean maintainable code ด้วย external files และ debug common errors ด้วย browser Developer Tools ได้แล้ว การใช้ external .js file พร้อม defer attribute เป็น recommended approach สำหรับ production web projects ส่วนใหญ่
เพื่อต่อยอด JavaScript skills สำรวจ tutorials ต่อไป:
- How To Use the JavaScript Developer Console
- How To Write Comments in JavaScript
- Understanding Syntax and Code Structure in JavaScript
- Understanding Variables, Scope, and Hoisting in JavaScript
งานนี้ได้รับอนุญาตภายใต้ Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.