ตัวอย่างการใช้งาน AJAX กับเว็บไซต์ ตอนที่ 3
ในบทนี้ผมจะอธิบายถึงตัวอย่างแต่ละรายการนะครับ เริ่มจากตัวอย่างแรก ตัวอย่างการโหลดหน้าเว็บด้วย Ajax ซึ่งตัวอย่างนี้จะแสดงให้เห็นถึงการใช้ Ajax ในการโหลดเว็บไซต์ทั้งหน้ามาแสดงผล
เริ่มต้นที่ HTML แบ่งออกเป็น 3 ส่วน
ถัดมาก็จะเป็นส่วนของ CSS ที่ใช้ในการแสดงผลรูปรอโหลด เนื่องจากเราจะมีการใช้ div#loading เป็นตัวแสดงผล ซึ่งในตอนเริ่มต้นจะไม่มีคลาสใดๆทั้งสิ้น จนกระทั่งเรากดปุ่ม Load ตัว GAjax จะทำการใส่คลาส wait ลงใน div#loading ซึ่งที่คลาส div#loading.wait ได้ถูกกำหนดให้แสดงรูปรอโหลด จนกระทั่ง Ajax ประมวลผลเสร็จและส่งค่ากลับมา GAjax ก็จะถอดเอาคลาส wait ออกจาก div#loading เป็นอันสิ้นสุดการแสดงผลรูปรอโหลด
ส่วนสุดท้าย หัวใจสำคัญคือคำสั่งของ ๋Javascript ที่ใช้
โค้ดด้านบนเป็นคำสั่งตรวจจับการกดปุ่ม Load ซึ่งเมื่อมีการกดปุ่มจะเข้าไปทำงานภายในฟังก์ชั่น
โค้ดด้านบนเป็นส่วนของ Ajax โดยที่ข้อมูลที่จะส่งจะถูกกำหนดลงในตัวแปร q ส่วน Object GAjax ถูกสร้างใส่ไว้นในตัวแปร req ซึ่งจริงๆแล้ว สามารถเขียนคำสั่งนี้แบบสั้นๆได้
จากตัวอย่าง เมื่อรับค่ากลับมาแล้ว ก็จะถูกนำข้อมูลที่ตอบกลับในรูปแบบข้อความที่ xhr.responseText ใส่ลงในพื้นที่แสดงผล
ในส่วนของไฟล์ PHP ซึ่งเป็น Model ชื่อคลาส Index\Index\Model เมธอด web ตามที่กำหนดใน GAjax (สังเกตุนะครับว่า URL ที่กำหนดสัมพันธ์กับชื่อคลาสอย่างไร สามารถดูได้จาก Router)
เมธอดนี้ ทำหน้าที่รับค่า URL ที่ต้องการแล้วโหลดหน้าเว็บทั้งหน้าด้วย file_get_contents() ได้เป็น HTML มาส่งค่ากลับไป
ในทางปฎิบัติ ถ้าเป็นการโหลดหน้าเว็บไซต์ของตัวเอง เราสามารถเขียนคำสั่งอื่นใด รวมถึงการ query ข้อมูลจากฐานข้อมูล เสร็จแล้วจัดรูปแบบและใส่ tag ที่ต้องการ เสร็จแล้วส่งกลับไปแสดงผลยังพื้นที่แสดงผลก็ได้
ตัวอย่างนี้ดูได้ที่นี่นะครับ https://projects.kotchasan.com/...index.php?module=web
<!-- element สำหรับแสดงรูปรอโหลด -->
<div id='loading'></div>
<!-- ฟอร์มสำหรับรับค่า เพื่อส่งไปโดย Ajax -->
<label for="demo_txt">โหลดเว็บไซต์ด้วย Ajax</label>
<input type="text" id="demo_txt" value="https://www.kotchasan.com">
<button id="demo_send">Load</button>
<!-- แสดงผลลัพท์ -->
<div id="demo_result"></div>
เริ่มต้นที่ HTML แบ่งออกเป็น 3 ส่วน
- อันแรกคือ div#loading ซึ่งเราจะใช้ในการแสดงรูปรอโหลดตอนที่โหลดด้วย Ajax
- ส่วนที่สองคือส่วนที่ประกอบด้วย input สำหรับรับค่าและปุ่ม Load ที่ใช้ในการกดส่งข้อมูล
- สุดท้ายคือพื้นที่สำหรับแสดงผลเนื้อหาที่โหลดมาได้ คือ div#demo_result
/* style ของรูปรอโหลด */
div#loading {
background-position: center;
background-repeat: no-repeat;
width: 100px;
height: 100px;
position: absolute;
top: -100%;
}
div#loading.wait {
background-image: url('loading.gif');
}
ถัดมาก็จะเป็นส่วนของ CSS ที่ใช้ในการแสดงผลรูปรอโหลด เนื่องจากเราจะมีการใช้ div#loading เป็นตัวแสดงผล ซึ่งในตอนเริ่มต้นจะไม่มีคลาสใดๆทั้งสิ้น จนกระทั่งเรากดปุ่ม Load ตัว GAjax จะทำการใส่คลาส wait ลงใน div#loading ซึ่งที่คลาส div#loading.wait ได้ถูกกำหนดให้แสดงรูปรอโหลด จนกระทั่ง Ajax ประมวลผลเสร็จและส่งค่ากลับมา GAjax ก็จะถอดเอาคลาส wait ออกจาก div#loading เป็นอันสิ้นสุดการแสดงผลรูปรอโหลด
// button click
$G('demo_send').addEvent('click', function () {
// ข้อมูลสำหรับส่งไป
var q = 'url=' + $E('demo_txt').value;
// create GAjax
var req = new GAjax();
// กำหนดการแสดงรูปรอโหลดกลางจอ
req.initLoading('loading', true);
// เรียกข้อมูลด้วย Ajax โดยการส่งค่า url ที่ต้องการไปยัง Index\Web\Model->web()
req.send('index.php/index/model/index/web', q, function (xhr) {
// นำ HTML ที่รับมาจาก Ajax ใส่ลงใน div#demo_result เพื่อแสดงผลลัพท์
$E('demo_result').innerHTML = xhr.responseText;
});
});
ส่วนสุดท้าย หัวใจสำคัญคือคำสั่งของ ๋Javascript ที่ใช้
// button click
$G('demo_send').addEvent('click', function (e) {
// เขียนคำสั่งเมื่อมีการกดปุ่ม
});
โค้ดด้านบนเป็นคำสั่งตรวจจับการกดปุ่ม Load ซึ่งเมื่อมีการกดปุ่มจะเข้าไปทำงานภายในฟังก์ชั่น
// ข้อมูลสำหรับส่งไป
var q = 'url=' + $E('demo_txt').value;
// create GAjax
var req = new GAjax();
// กำหนดการแสดงรูปรอโหลดกลางจอ
req.initLoading('loading', true);
// เรียกข้อมูลด้วย Ajax โดยการส่งค่า url ที่ต้องการไปยัง Index\Web\Model->web()
req.send('index.php/index/model/index/web', q, function (xhr) {
// นำ HTML ที่รับมาจาก Ajax ใส่ลงใน div#demo_result เพื่อแสดงผลลัพท์
$E('demo_result').innerHTML = xhr.responseText;
});
โค้ดด้านบนเป็นส่วนของ Ajax โดยที่ข้อมูลที่จะส่งจะถูกกำหนดลงในตัวแปร q ส่วน Object GAjax ถูกสร้างใส่ไว้นในตัวแปร req ซึ่งจริงๆแล้ว สามารถเขียนคำสั่งนี้แบบสั้นๆได้
new GAjax().initLoading('loading', true).send('index.php/index/model/index/web', q, function (xhr) {
// เขียนคำสั่งหลังจากรับค่าจาก Ajax ที่นี่
});
จากตัวอย่าง เมื่อรับค่ากลับมาแล้ว ก็จะถูกนำข้อมูลที่ตอบกลับในรูปแบบข้อความที่ xhr.responseText ใส่ลงในพื้นที่แสดงผล
ในส่วนของไฟล์ PHP ซึ่งเป็น Model ชื่อคลาส Index\Index\Model เมธอด web ตามที่กำหนดใน GAjax (สังเกตุนะครับว่า URL ที่กำหนดสัมพันธ์กับชื่อคลาสอย่างไร สามารถดูได้จาก Router)
/**
* โหลดเว็บไซต์ด้วย Ajax
*
* @param Request $request
* @return string
*/
public function web(Request $request)
{
// ตรวจสอบว่าเรียกมาจากภายในไซต์
if ($request->isReferer()) {
// ดูค่าที่ส่งมา
//print_r($_POST);
// รับค่า URL ที่ส่งมา
$url = $request->post('url')->url();
if ($url != '') {
// โหลด URL ที่ส่งมา
$content = file_get_contents($url);
// คืนค่า HTML ไปยัง Ajax
echo $content;
}
}
}
เมธอดนี้ ทำหน้าที่รับค่า URL ที่ต้องการแล้วโหลดหน้าเว็บทั้งหน้าด้วย file_get_contents() ได้เป็น HTML มาส่งค่ากลับไป
ในทางปฎิบัติ ถ้าเป็นการโหลดหน้าเว็บไซต์ของตัวเอง เราสามารถเขียนคำสั่งอื่นใด รวมถึงการ query ข้อมูลจากฐานข้อมูล เสร็จแล้วจัดรูปแบบและใส่ tag ที่ต้องการ เสร็จแล้วส่งกลับไปแสดงผลยังพื้นที่แสดงผลก็ได้
ตัวอย่างนี้ดูได้ที่นี่นะครับ https://projects.kotchasan.com/...index.php?module=web