ตัวอย่างการใช้งาน AJAX กับเว็บไซต์ ตอนที่ 3
<!-- 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