ก่อนที่จะใช้ jQuery ส่งข้อมูลแบบ ajax ออกไป อาจจะใช้ javascript ทำงานเบื้องต้นก่อนได้ เช่น การตรวจสอบข้อมูล (validation) ว่า user ได้ทำการกรอกข้อมูลตามที่จำเป็นครบรึเปล่า หรือนำข้อมูลออกไปจากแบบฟอร์ม โดยที่ไม่ต้องไปทำในฝั่ง server
ใน jQuery Ajax สามารถทำได้โดยการระบุ “beforeSend” ตาม code ตัวอย่าง
jQuery: advance process before send data
$.ajax({
"beforeSend": function(jqXHR, settings) {
/* ใส่ตัวแปรเข้าไปเพิ่ม */
settings.data += '&ajax=true';
/* แยกตัวแปรไว้ตรวจสอบข้อมูล */
var params = new URLSearchParams(settings.data);
/* บังคับกรอกข้อมูล */
if (params.get('way') == 'socialid' && params.get('socialid') == '') {
jqXHR.abort();
alert('กรุณากรอกหมายเลขบัตรประชาชน');
return false;
} else if (params.get('way') == 'phone' && params.get('phone') == '') {
jqXHR.abort();
alert('กรุณากรอกหมายเลขโทรศัพท์');
return false;
}
if (params.get('amount') == '') {
jqXHR.abort();
alert('กรุณากรอกจำนวนเงิน');
return false;
}
/* เอาข้อมูลที่ไม่ต้องการส่งออก */
settings.data = RemoveParameterFromUrl(settings.data, 'way');
settings.data = RemoveParameterFromUrl(settings.data, 'way');
if (params.get('way') == 'socialid') {
settings.data = RemoveParameterFromUrl(settings.data, 'phone');
} else {
settings.data = RemoveParameterFromUrl(settings.data, 'socialid');
}
},
"data": formA.serialize(),
"method": "POST",
"success": function(data, textStatus, jqXHR) {
$('#resultA').html(data);
},
"url": "values.php",
});
เราจะดูข้อมูลที่รวบรวมมาได้ใน object settings.data และสามารถต่อ string เพิ่มเข้าไปได้เหมือนการต่อ string
add new data
settings.data += '&ajax=true';
การที่จะแยกข้อมูลออกมาสามารถใช้
get value from query string
var params = new URLSearchParams(settings.data);
แบ่งข้อมูลออกมาเป็น array เพื่อใช้ตรวจสอบข้อมูลหรือจะนำไปใช้ในการเปลี่ยนแปลงข้อมูล เช่นเดียวกันก็สามารถ delete ลบข้อมูลที่ไม่ได้การออกไปได้โดยใช้ function
delete data from url
function RemoveParameterFromUrl(url, parameter) {
return url.replace(new RegExp('^([^#]*\?)(([^#]*)&)?' + parameter + '(\=[^]*)?(&|#|$)'), '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/, '$1$3$4');
}
ตัวอย่าง form เขียนโดยยกกรณีโอนเงินโดยใช้ พร้อมเพย์ (PromptPay) ที่ user จะเลือกได้ว่าจะโอนเงินโดยใช้ บัตรประชาชน หรือหมายเลขโทรศัพท์ของผู้รับแทนที่จะใช้หมายเลขบัญชี
ajax.form.advance.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>jQuery: Advance Form Send</title>
<link href="../vendor/twbs/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" type="text/css">
</head>
<body>
<h1>พร้อมเพย์ (PromptPay)</h1>
<form action="values.php" class="form-horizontal" id="formA" method="post">
<div class="form-group">
<label class="col-sm-2 control-label">โอนเงินด้วย</label>
<div class="col-sm-10">
<div class="radio">
<label>
<input checked name="way" type="radio" value="socialid"> หมายเลขบัตรประชาชน
</label>
</div>
<div class="radio">
<label>
<input name="way" type="radio" value="phone"> หมายเลขโทรศัพท์
</label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="socialidI">หมายเลขบัตรประชาชน</label>
<div class="col-sm-10">
<input class="form-control" id="socialidI" maxlength="13" name="socialid" placeholder="หมายเลขบัตรประชาชน" type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="phoneI">หมายเลขโทรศัพท์</label>
<div class="col-sm-10">
<input class="form-control" id="phoneI" maxlength="11" name="phone" placeholder="หมายเลขโทรศัพท์" type="tel">
</div>
</div>
<div class="form-group">
<label for="amount" class="col-sm-2 control-label">จำนวนเงิน</label>
<div class="col-sm-10">
<div class="input-group">
<input class="form-control" id="amount" max="5000" min="0" name="amount" placeholder="จำนวนเงิน" type="number">
<div class="input-group-addon">฿</div>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-10 text-right">
<button type="submit" class="btn btn-success">โอนเงิน</button>
</div>
</div>
</form>
<div class="col-sm-12" id="resultA"></div>
<script src="../vendor/components/jquery/jquery.min.js"></script>
<script>
function RemoveParameterFromUrl(url, parameter) {
return url.replace(new RegExp('^([^#]*\?)(([^#]*)&)?' + parameter + '(\=[^&#]*)?(&|#|$)'), '$1$3$5').replace(/^([^#]*)((\?)&|\?(#|$))/, '$1$3$4');
}
$(function () {
var formA = $('#formA');
formA.submit(function (event) {
event.preventDefault();
$.ajax({
"beforeSend": function (jqXHR, settings) {
/* ใส่ตัวแปรเข้าไปเพิ่ม */
settings.data += '&ajax=true';
/* แยกตัวแปรไว้ตรวจสอบข้อมูล */
var params = new URLSearchParams(settings.data);
/* บังคับกรอกข้อมูล */
if (params.get('way') == 'socialid' && params.get('socialid') == '') {
jqXHR.abort();
alert('กรุณากรอกหมายเลขบัตรประชาชน');
return false;
} else if (params.get('way') == 'phone' && params.get('phone') == '') {
jqXHR.abort();
alert('กรุณากรอกหมายเลขโทรศัพท์');
return false;
}
if (params.get('amount') == '') {
jqXHR.abort();
alert('กรุณากรอกจำนวนเงิน');
return false;
}
/* เอาข้อมูลที่ไม่ต้องการส่งออก */
settings.data = RemoveParameterFromUrl(settings.data, 'way');
settings.data = RemoveParameterFromUrl(settings.data, 'way');
if (params.get('way') == 'socialid') {
settings.data = RemoveParameterFromUrl(settings.data, 'phone');
} else {
settings.data = RemoveParameterFromUrl(settings.data, 'socialid');
}
},
"data": formA.serialize(),
"method": "POST",
"success": function (data, textStatus, jqXHR) {
$('#resultA').html(data);
},
"url": "values.php",
});
});
});
</script>
</body>
</html>
และฝั่ง server side ที่ควรจะมีการ validation ตรวจสอบข้อมูลซ้ำอีกครั้งเพื่อความมั่นใจ แต่ตัวอย่างนี้จะแสดงข้อมูลที่ทางฝั่ง server ได้รับเท่านั้น เพื่อให้เห็นการ edit แก้ข้อมูลที่ส่งไป
values.php
<?php
echo 'GET<pre>', print_r($_GET, true), '</pre>';
echo 'POST<pre>', print_r($_POST, true), '</pre>';