วิธีเปลี่ยน URL โดยที่ไม่ต้องรีเฟรสเบราว์เซอร์เป็นอีกลูกเล่นหนึ่งที่กำลังเป็นที่นิยมของเว็บไซต์จำนวนมากในปัจจุบัน ซึ่งใช้ร่วมกับ Ajax ที่สามารถอัพเดทเนื้อหาของหน้าเว็บโดยที่ไม่ต้องรีเฟรสเบราร์เซอร์ ทำให้เว็บของเราแสดงเนื้อหาให้กับผู้ใช้ได้เร็วขึ้น เพราะโหลดเฉพาะเนื้อหาที่มีการอัพเดทเท่านั้น (ส่วน header, sidebar และ footer ไม่จำเป็นต้องโหลดใหม่) แถมยังทำให้ URL ที่แสดงเปลี่ยนไปเป็นลิงค์ที่ผู้ใช้คลิกได้อีกด้วย แหล่มมั๊ยล่ะ ^^
[imooh_google_ads]
ในบทความนี้จะใช้ประโยชน์จาก History API ของ HTML5 ซึ่งมีฟังก์ชัน replaceState() เป็นพระเอก เดี๋ยวผมจะทำเป็นตัวอย่างง่ายให้ดูไปด้วยครับ เพื่อให้เพื่อนๆ สามารถนำไปประยุกต์ใช้ได้ด้วย ก่อนอื่นก็สร้างไฟล์ index.html ขึ้นมาก่อนครับ
1. ไฟล์ index.html มี 2 ส่วน คือ sidebar และ content ครับ
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Home</title> <style type="text/css" media="all"> #wrapper{ width: 960px; margin: 0px auto; } #sidebar{ width: 200px; display:inline-block; } #content{ width:700px; display:inline-block; } </style> <!-- โหลด jQuery จาก CDN ของ Google --> <script charset="utf-8" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> </head> <body> <div id="wrapper"> <div id="sidebar"> <ol> <li><a href="page1.html">Page 1</a></li> <li><a href="page2.html">Page 2</a></li> <li><a href="page3.html">Page 3</a></li> </ol> </div> <!-- div ที่ต้องการอัพเดทเนื้อหาด้วย Ajax --> <div id="content"> <h1>Home</h1> <p>Home Content</p> </div> </div> <script> $(function(){ /* เพิ่มฟังก์ชันที่จะเรียก Ajax เมื่อมีการคลิกลิงค์ที่อยู่ภายใต้ div ที่มี id="sidebar" */ $('#sidebar').delegate('a', 'click', function(e){ e.preventDefault(); var link = this.href; /* ดึงเนื้อหาจากลิงค์ด้วย Ajax เมื่อผู้ใช้กดลิงค์ */ $.get(link, function(res){ /* อัพเดทเนื้อหาที่ได้จาก Ajax ไปที่ div ที่มี id="content" */ $('#content').html(res); /* หลังจากอัพเดทเนื้อหาเสร็จ เปลี่ยน URL ของเบราว์เซอร์ */ window.history.replaceState(null, null, link); }); }); }); </script> </body> </html>
2. สร้างไฟล์ page1.html, page2.html, page3.html ที่เราจะลิงค์ไปหาครับ
//page1.html <h1>Page 1</h1> <p>Page content 1</p> //page2.html <h1>Page 2</h1> <p>Page content 2</p> //page3.html <h1>Page 3</h1> <p>Page content 3</p>
เท่านี้เราก็สามารถอัพเดทเนื้อหาและเปล่ียน URL ของเบราว์เซอร์ โดยที่ไม่ต้องรีเฟรสเบราว์เซอร์ได้แล้วครับ ส่วนข้อจำกัดของการใช้ฟังก์ชัน replaceState() คือ เราจะไม่สามารถกดปุ่มย้อนกลับ (Back) ของเบราว์เซอร์ได้นะครับ ^^