Professional Documents
Culture Documents
AJAX, là viết tắt của Asynchronous JavaScript and XML (tạm dịch là JavaScript và XML không đồng bộ), là một
kỹ thuật mới để tạo các ứng dụng web giàu tính tương tác, nhanh hơn và mượt mà hơn với sự giúp đỡ của
XML, HTML, CSS và JavaScript.
AJAX không phải là ngôn ngữ lập trình mới. Tên AJAX ở đây không có nghĩa là bạn phải học XML trước khi
cần học AJAX. Điều này là không cần thiết.
Dưới đây là mục lục các bài hướng dẫn học AJAX cơ bản và nâng cao trong loạt bài này:
MỤC LỤC
AJAX là gì ?
Xử lý Response
Sự kiện onreadystatechange
AJAX và PHP
AJAX và ASP
Phải khẳng định một điều là: AJAX là ước mơ của các lập trình viên phát triển các ứng dụng Web, bởi vì bạn
có thể:
Cập nhật một Webpage mà không cần tải lại trang. Điều này giúp trang web của bạn chạy mượt mà hơn.
AJAX không phải là ngôn ngữ lập trình mới. Tên AJAX ở đây không có nghĩa là bạn phải học XML trước khi
cần học AJAX. Điều này là không cần thiết.
AJAX cho phép các trang web được cập nhật một cách không đồng bộ bằng cách trao đổi các lượng dữ liệu
nhỏ với Server. Tức là AJAX giúp cập nhật các phần nhỏ trong trang mà không cần tải lại toàn bộ trang. Nếu
đến đây bạn chưa hiểu thì các dòng tiếp theo đây sẽ giúp bạn hiểu cách AJAX làm việc hơn.
Như các bạn đã biết, các ứng dụng web truyền thống (trước khi có AJAX) truyền tải thông tin tới và từ Server
một cách không đồng bộ. Tức là, khi bạn điền thông tin vào một Form, nhấn nút Submit và sau đó bạn sẽ
được hướng tới một trang khác với thông tin mới từ Server trả về.
Với AJAX, khi bạn nhấn nút Submit, JavaScript sẽ tạo một Request tới Server, thông dịch các kết quả, và cập
nhật màn hình hiện tại (chứ không tải lại toàn bộ trang hoặc hướng bạn tới một trang khác như trên). Tất
nhiên là người sử dụng sẽ không bao giờ biết được những gì đã được truyền tải tới Server.
AJAX là một kỹ thuật phát triển Web độc lập với các phần mềm Web Server.
Với AJAX, người dùng có thể tiếp tục sử dụng ứng dụng trong khi các chương trình trên Client tạo Request để
lấy thông tin từ Server.
HTML (hoặc XHTML) với CSS trong việc hiển thị thông tin.
Sử dụng đối tượng XMLHttpRequest để nhận dữ liệu từ một Web Server một cách không đồng bộ.
Sử dụng mô hình DOM với sự trợ giúp của JavaScript để hiển thị/sử dụng dữ liệu.
Nếu bạn đã đọc chương giới thiệu về loạt bài AJAX này thì yêu cầu cơ bản nhất để đọc và hiểu loạt bài đó là
bạn phải nắm vững JavaScript, CSS, HTML. Do đó nếu bạn chưa nắm vững các công nghệ này, bạn có thể
tham khảo các loạt bài hướng dẫn mà VietJack cung cấp:
Nếu bạn đã chuẩn bị mọi thứ rồi thì còn chờ gì nữa. Chúng ta đến với chương tiếp theo: Đối tượng
XMLHttpRequest trong AJAX.
Đối tượng XMLHttpRequest được sử dụng để trao đổi dữ liệu với một Server ở Background. Tức là với đối
tượng XMLHttpRequest này, bạn có thể cập nhật các phần nhỏ của trang mà không cần tải lại toàn bộ trang.
Đối tượng XMLHttpRequest (viết tắt là XHR) là một API có thể được sử dụng bởi JavaScript, Jscript, VBScript
và một số ngôn ngữ phát triển ứng dụng Web khác để truyền tải và thao tác dữ liệu XML tới và từ một
WebServer bởi sử dụng HTTP bằng cách thiết lập một kênh kết nối độc lập giữa Client-Side và Server-Side.
Dữ liệu được trả về từ các lời gọi tới đối tượng XMLHttpRequest sẽ thường được cung cấp bởi Database ở
Backend. Ngoài định dạng XML, đối tượng XMLHttpRequest cong được sử dụng để lấy dữ liệu trong các định
dạng khác, chẳng hạn như JSON hay định dạng thuần text.
Tạo đối tượng XMLHttpRequest trong AJAX
Xin nhắc lại lần nữa là tất cả trình duyệt hiện đại (Chrome, IE7+, FireFox, Safari và Opera) đều đã có sẵn và
hỗ trợ đối tượng XMLHttpRequest.
Với các phiên bản IE cũ hơn (chẳng hạn như IE5 và IE6) sử dụng đối tượng ActiveXObject:
Trong khi lập trình phát triển các ứng dụng Web, để bao tất cả các trường hợp và để xử lý mọi trình duyệt
như trong trường hợp này (để bao cả IE5 và IE6), bạn cần kiểm tra xem trình duyệt có hỗ trợ đối tượng
XMLHttpRequest không. Nếu có, bạn tạo một đối tượng XMLHttpRequest; còn nếu không, bạn tạo một đối
tượng ActiveXObject:
var xhttp;
if (window.XMLHttpRequest){
} else {
//tao doi tuong ActiveXObject neu trinh duyet khong ho tro XMLHttpRequest
Các form phương thức open() này được sử dụng để xác định phương thức (tham số phuong_thuc), đường
dẫn URL, và một số thuộc tính tùy ý khác cho một Request.
Trong đó:
o Tham số phuong_thuc có thể là một trong các giá trị GET, POST, hoặc HEAD. Bạn cũng có thể sử dụng các
phương thức PUT, DELETE. Tuy nhiên hai phương thức này chủ yếu được sử dụng trong các ứng dụng REST
app.
o Tham số async xác định xem Request nên được xử lý theo cách không đồng bộ hoặc đồng bộ. Tham số này
nhận hai giá trị true cho không đồng bộ, false cho đồng bộ.
Thêm một cặp header/value tới trường HTTP Header để gửi đi.
Một Event Handler lắng nghe và xử lý một sự kiện khi có thay đổi về trạng thái nào diễn ra.
readyState
Thuộc tính này định nghĩa trạng thái hiện tại của đối tượng XMLHttpRequest.
Bảng dưới đây liệt kê các giá trị cho thuộc tính readyState:
Trạng Miêu tả
thái
responseText
responseXML
Trả về phản hồi dưới định dạng XML. Thuộc tính này trả về một đối tượng XML để có thể được parse bởi sử
dụng các phương thức và thuộc tính của mô hình DOM.
status
Trả về trạng thái dưới dạng một số (ví dụ: 404 cho "Not Found", 200 cho "OK")
statusText
Trả về trạng thái dưới dạng một số (ví dụ: "Not Found", "OK").
Như trong chương trước đã đề cập, đối tượng XMLHttpRequest được sử dụng để trao đổi dữ liệu với một
Server. Vậy hoạt động gửi Request tới và nhận Response từ Server diễn ra như thế nào khi sử dụng đối
tượng XMLHttpRequest. Chương này chúng ta cùng tìm hiểu khía cạnh thứ nhất: Gửi Request tới Server bởi
sử dụng đối tượng XMLHttpRequest.
Gửi Request tới Server trong AJAX
Để gửi một Request tới một Server, chúng ta sử dụng các phương thức open() và send() của phương thức
XMLHttpRequest đã được trình bày trong chương trước.
xhttp.send();
open(phuong_thuc, url, async) Xác định kiểu Request. Trong đó tham số phuong_thuc
xác định kiểu Request (chẳng hạn GET, POST), tham
số URL xác định vị trí file trên Server, tham số async
xác định cách xử lý Request: true cho không đồng bộ
hoặc false cho đồng bộ.
Tuy nhiên, bạn cần sử dụng phương thức POST để tạo Request khi:
Gửi một lượng dữ liệu lớn (phương thức POST không có giới hạn về kích cỡ dữ liệu được gửi, còn GET thì có).
Gửi dữ liệu nhập bởi người dùng (ví dụ như Password). Sử dụng POST thì an toàn hơn GET.
Cached Result là gì ?
Trước khi đi vào tìm hiểu một số ví dụ minh họa về cách gửi Request tới Server bởi sử dụng các phương thức
của đối tượng XMLHttpRequest trong AJAX, mình xin giải thích khái niệm Cached Result.
Với các trình duyệt Web, mỗi khi bạn gửi một Request với một URL nào đó (có ID cụ thể) bởi sử dụng
phương thức GET và nhận Response từ Server cho yêu cầu này và trình duyệt sẽ lưu phần phản hồi này
(tương ứng với URL và ID trên). Lần tới, khi bạn tạo Request cũng với phương thức GET và URL này, thì trình
duyệt sẽ tự động trả về Response đã lưu trước đó mà không tạo một Request tới Server nữa. Đây chính là
Cached Result (tạm dịch: kết quả đã được lưu giữ vào bộ nhớ trình duyệt và lập trình viên thường gọi hiện
tượng này là KÍCH).
<html>
<body>
<p id="demo"></p>
<script>
function loadDoc() {
xhttp.onreadystatechange = function() {
document.getElementById("demo").innerHTML = xhttp.responseText;
};
xhttp.send();
</script>
</body>
</html>
Với ví dụ trên, bạn có thể nhận một Cached Result. Để tránh điều này, bạn nên xác định thêm một ID duy
nhất cho URL.
xhttp.send();
Nếu bạn muốn gửi một số thông tin nào đó bởi sử dụng phương thức GET này, bạn thêm thông tin này vào
URL.
xhttp.send();
Ví dụ
<html>
<body>
<p id="demo"></p>
<script>
function loadDoc() {
xhttp.onreadystatechange = function() {
document.getElementById("demo").innerHTML = xhttp.responseText;
};
</script>
</body>
</html>
Để gửi dữ liệu (giả sử một HTML Form chẳng hạn), bạn sử dụng phương thức setRequestHeader() để thêm
một HTTP Header. Sau đó xác định kiểu dữ liệu bạn muốn gửi trong phương thức send() của đối tượng
XMLHttpRequest.
setRequestHeader(header, value) Tham số header xác định tên của Header, và tham số
value xác định giá trị cho Header
File này có thể là bất kỳ loại nào (ví dụ .txt hay .xml) hay bất kỳ dạng Script File nào (giống như .asp hoặc
.php).
Gửi các Request không đồng bộ là một bước cải tiến lớn cho các lập trình viên Web. Nhiều tác vụ cùng được
thực hiện trên Server là rất tốn kém. Trước khi có AJAX, việc này có thể gây hiện tượng treo hoặc thậm chí
dừng ứng dụng.
Với AJAX, JavaScript không cần phải đợi phản hồi Response được trả về từ Server, thay vào đó nó có thể:
Thực thi các tác vụ khác trong khi đợi Response từ Server.
Sau đó xử lý Response khi đã phần phản hồi này đã sẵn sàng trả về.
xhttp.onreadystatechange = function() {
document.getElementById("demo").innerHTML = xhttp.responseText;
};
xhttp.send();
Bạn nên nhớ rằng JavaScript sẽ KHÔNG tiếp tục thực thi cho đến khi Response được trả về đã sẵn sàng. Nếu
Server của bạn đang bận hoặc chậm chạp trong việc xử lý nhiều Request thì ứng dụng của bạn có thể bị treo
hoặc bị dừng.
Ghi chú: khi thiết lập là false, bạn ĐỪNG viết một hàm để xử lý sự kiện onreadystatechange. Bạn nên đặt
phần code ngay sau phương thức send() như dưới đây:
xhttp.send();
document.getElementById("demo").innerHTML = xhttp.responseText;
Để nhận phản hồi Response từ một Server, bạn sử dụng thuộc tính responseText hoặc responseXML của
đối tượng XMLHttpRequest. Trong đó:
Thuộc tính responseText nhận dữ liệu phản hồi dưới dạng chuỗi.
Thuộc tính responseXML nhận dữ liệu phản hồi dưới dạng XML.
Thuộc tính responseText trả về dữ liệu dưới dạng chuỗi và bạn có thể sử dụng nó như sau:
<html>
<body>
<script>
function loadDoc() {
xhttp.onreadystatechange = function() {
document.getElementById("demo").innerHTML = xhttp.responseText;
};
xhttp.send();
</script>
</body>
</html>
<html>
<body>
<p id="demo"></p>
<script>
function loadDoc() {
xhttp.onreadystatechange = function() {
xmlDoc = xhttp.responseXML;
txt = "";
x = xmlDoc.getElementsByTagName("ARTIST");
document.getElementById("demo").innerHTML = txt;
};
xhttp.send();
</script>
</body>
</html>
Sự kiện onreadystatechange trong AJAX
Khi bạn đã gửi một Request tới một Server, có thể bạn muốn thực hiện một số hoạt động nào đó trên phần
Response được trả về. Điều này có thể thực hiện thông qua sự giúp đỡ của sự kiện onreadystatechange trong
AJAX.
Sự kiện onreadystatechange này sẽ được kích hoạt mỗi khi trạng thái readyState thay đổi. Mà thuộc tính
readyState này giữ phần biểu diễn status của đối tượng XMLHttpRequest, do đó dựa vào từng giá trị của
readyState thì bạn có thể cung cấp hoạt động tương ứng nào đó.
Bảng dưới nhắc lại một số thuộc tính quan trọng của đối tượng XMLHttpRequest trong AJAX:
onreadystatechange Một Event Handler lắng nghe và xử lý một sự kiện khi có thay đổi về
trạng thái nào diễn ra.
readyState Thuộc tính này định nghĩa trạng thái hiện tại của đối tượng
XMLHttpRequest.
status Trả về trạng thái dưới dạng một số (ví dụ: 404 cho "Not Found", 200
cho "OK")
Trong sự kiện onreadystatechange, chúng ta sẽ xác định xem điều gì sẽ xảy ra khi Response từ Server đã sẵn
sàng để được xử lý.
<body>
<div id="demo"><h2>Hay de AJAX giup ban thay doi phan text nay</h2></div>
<script>
function loadDoc() {
xhttp.onreadystatechange = function() {
document.getElementById("demo").innerHTML = xhttp.responseText;
};
xhttp.send();
</script>
</body>
</html>
Ghi chú: sự kiện onreadystatechange được kích hoạt 5 lần (tương ứng với các giá trị của status).
Nếu bạn có nhiều hơn một tác vụ AJAX trên Website của bạn, thì bạn nên tạo một hàm để tạo đối tượng
XMLHttpRequest, và gọi hàm này cho mỗi tác vụ AJAX.
Lời gọi hàm này nên có một URL và điều cần làm tương ứng với sự kiện onreadystatechange (có thể khác
nhau cho mỗi lời gọi hàm).
xhttp=new XMLHttpRequest();
xhttp.onreadystatechange = function() {
cfunc(xhttp);
};
xhttp.send();
Qua các chương trước, có lẽ bạn đã dần mường tượng ra cách một ứng dụng AJAX hoạt động. Để minh họa
chi tiết hơn, chương này mình sẽ cung cấp một ví dụ về một ứng dụng AJAX đơn giản, sau đó giải thích chi
tiết các hoạt động xảy ra trong ứng dụng AJAX này.
Đối tượng XMLHttpRequest tạo một Ansyn Request (ansyn: không đồng bộ) tới Webserver.
Ví dụ: hàm validateUserId() được sử dụng để xử lý sự kiện người dùng nhập thông tin vào một form nào đó.
Tạo đối tượng XMLHttpRequest trong AJAX
Bước tiếp theo và cũng là bước khởi tạo ứng dụng AJAX là bước tạo đối tượng XMLHttpRequest. Đối tượng
này là chìa khóa then chốt, là nền tảng của kỹ thuật AJAX.
function ajaxFunction(){
try{
//Voi cac trinh duyet dien dai: Opera 8.0+, Firefox, Safari
}catch (e){
try{
}catch (e) {
try{
}catch (e){
return false;
function validateUserId() {
ajaxFunction();
// Ham processRequest() la mot ham callback.
ajaxRequest.onreadystatechange = processRequest;
ajaxRequest.send(null);
function validateUserId() {
ajaxFunction();
ajaxRequest.onreadystatechange = processRequest;
ajaxRequest.send(null);
Giả sử trong UserId Box, bạn nhập giá trị VietJack thì với Request ở trên thì URL sẽ được thiết lập thành
validate?id=VietJack.
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
response.getWriter().write("true");
else
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
response.getWriter().write("false");
Như trong ví dụ sau, hàm này thiết lập giá trị cho một biến là true hoặc false dựa trên giá trị trả về từ Server.
function processRequest() {
if (req.readyState == 4) {
if (req.status == 200) {
...
}
Cập nhật HTML DOM trong AJAX
Cuối cùng là bước HTML DOM sẽ được cập nhật. Để có được một tham chiếu tới một phần tử nào đó, bạn có
thể làm theo cách:
document.getElementById("userIdMessage"),
Với cách này, bạn có thể sửa đổi các thuộc tính của phần tử hoặc thêm, sửa, hoặc xóa các phần tử con. Ví
dụ:
<script type="text/javascript">
<!--
function setMessageUsingDOM(message) {
var messageText;
if (message == "false") {
userMessageElement.style.color = "red";
else
userMessageElement.style.color = "green";
// Neu phan tu messageBody chua duoc tao: phu them mot phan tu moi
if (userMessageElement.childNodes[0]) {
userMessageElement.replaceChild(messageBody, userMessageElement.childNodes[0]);
else
userMessageElement.appendChild(messageBody);
}
}
-->
</script>
<body>
<div id="userIdMessage"><div>
</body>
AJAX và PHP
Ví dụ ứng dụng AJAX và PHP
Chương này mình sẽ trình bày một ví dụ minh họa cách sử dụng kỹ thuật AJAX trên Client Side và ngôn ngữ
PHP trên Server Side.
Trong ví dụ này, khi người dùng gõ một ký tự trong trường input, hàm JavaScript có tên là showHint() sẽ
được thực thi. Hàm này được kích hoạt bởi sự kiện onkeyup.
<html>
<body>
<h3>Ban hay nhap mot ten trong truong input ben duoi:</h3>
<form action="">
</form>
<script>
function showHint(str) {
var xhttp;
if (str.length == 0) {
document.getElementById("txtHint").innerHTML = "";
return;
document.getElementById("txtHint").innerHTML = xhttp.responseText;
};
xhttp.send();
</script>
</body>
</html>
Giải thích
Đầu tiên, kiểm tra xem nếu trường input là trống hay không (điều kiện str.length == 0). Nếu là trống thì xóa
nội dung của Placeholder và thoát khỏi hàm.
Tạo một hàm để thực thi khi Response từ Server đã sẵn sàng.
Gửi Request tới một PHP file (giả sử có tên là gethint.php) trên Server.
Bạn nên chú ý rằng tham số q được thêm vào "gethint.php?q=" + str.
<?php
$a[] = "An";
$a[] = "Bao";
$a[] = "Chinh";
$a[] = "Doanh";
$a[] = "Em";
$a[] = "Gam";
$a[] = "Hoang";
$a[] = "Kim";
$a[] = "Linh";
$a[] = "Ngoc";
$a[] = "Oanh";
$a[] = "Phuc";
$a[] = "Anh";
$a[] = "Nam";
$a[] = "Sen";
$a[] = "Dong";
$a[] = "Sinh";
$a[] = "Torres";
$a[] = "Ronaldo";
$a[] = "Messi";
$a[] = "Suares";
$a[] = "Morinho";
$a[] = "Viet";
$q = $_REQUEST["q"];
$hint = "";
// Tim tat ca cac hint co trong Array neu tham so $q khac ""
$q = strtolower($q);
$len=strlen($q);
foreach($a as $name) {
$hint = $name;
} else {
}
}
// Ket qua "Khong co suggestion nao" neu khong tim thay bat ky hint nao trong Array
?>
AJAX và ASP
Trong ví dụ này, khi người dùng gõ một ký tự trong trường input, hàm JavaScript có tên là showHint() sẽ
được thực thi. Hàm này được kích hoạt bởi sự kiện onkeyup.
<html>
<body>
<h3>Ban hay nhap mot ten trong truong input ben duoi:</h3>
<form action="">
</form>
<script>
function showHint(str) {
var xhttp;
if (str.length == 0) {
document.getElementById("txtHint").innerHTML = "";
return;
xhttp.onreadystatechange = function() {
document.getElementById("txtHint").innerHTML = xhttp.responseText;
};
xhttp.send();
</script>
</body>
</html>
Giải thích
Đầu tiên, kiểm tra xem nếu trường input là trống hay không (điều kiện str.length == 0). Nếu là trống thì xóa
nội dung của Placeholder và thoát khỏi hàm.
Tạo một hàm để thực thi khi Response từ Server đã sẵn sàng.
Gửi Request tới một ASP file (giả sử có tên là gethint.asp) trên Server.
Bạn nên chú ý rằng tham số q được thêm vào "gethint.asp?q=" + str.
<%
response.expires=-1
dim a(30)
a(2)="Bao"
a(3)="Chinh"
a(4)="Doanh"
a(5)="Em"
a(6)="Gam"
a(7)="Hoang"
a(8)="Kim"
a(9)="Linh"
a(10)="Ngoc"
a(11)="Oanh"
a(12)="Phuc"
a(13)="Anh"
a(14)="Nam"
a(15)="Sen"
a(16)="Dong"
a(17)="Sinh"
a(18)="Torres"
a(19)="Ronaldo"
a(20)="Messi"
a(21)="Suares"
a(22)="Morinho"
a(23)="Van Gan"
a(24)="Viet"
q=ucase(request.querystring("q"))
'Tim tat ca cac hint co trong Array neu do dai cua q>0
if len(q)>0 then
hint=""
for i=1 to 30
if q=ucase(mid(a(i),1,len(q))) then
if hint="" then
hint=a(i)
else
hint=hint & " , " & a(i)
end if
end if
next
end if
'Ket qua "Khong co suggestion nao" neu khong tim thay bat ky hint nao trong Array
if hint="" then
else
response.write(hint)
end if
%>
Chương này mình trình bày một ví dụ minh họa cách truy cập Database bởi sử dụng kỹ thuật AJAX. Trước khi
thực hiện ví dụ, bạn cần tạo một bảng có tên là ajax_vietjack trong Database (MySQL chẳng hạn) với các
trường như sau:
Tiếp đó bạn sử dụng lệnh INSERT trong MySQL để chèn dữ liệu vào trong bảng.
<body>
<!--
function ajaxFunction(){
try{
// Voi cac trinh duyet hien dai: Opera 8.0+, Firefox, Safari
}catch (e){
try{
}catch (e) {
try{
}catch (e){
return false;
ajaxRequest.onreadystatechange = function(){
if(ajaxRequest.readyState == 4){
ajaxDisplay.innerHTML = ajaxRequest.responseText;
}
}
// Bay gio, lay gia tri da nhap tu user va truyen no toi server script
ajaxRequest.send(null);
//-->
</script>
<form name='myForm'>
Sex:
<select id='sex'>
<option value="m">m</option>
<option value="f">f</option>
</select>
</form>
</body>
</html>
Max Age:
Max WPM:
Sex:
<?php
$dbhost = "localhost";
$dbuser = "dbusername";
$dbpass = "dbpassword";
$dbname = "dbname";
//Select Database
mysql_select_db($dbname) or die(mysql_error());
// Lay du lieu
$age = $_GET['age'];
$sex = $_GET['sex'];
$wpm = $_GET['wpm'];
$age = mysql_real_escape_string($age);
$sex = mysql_real_escape_string($sex);
$wpm = mysql_real_escape_string($wpm);
if(is_numeric($age))
if(is_numeric($wpm))
$query .= " AND wpm <= $wpm";
//Execute query
//Ket qua:
$display_string = "<table>";
$display_string .= "<tr>";
$display_string .= "<th>Name</th>";
$display_string .= "<th>Age</th>";
$display_string .= "<th>Sex</th>";
$display_string .= "<th>WPM</th>";
$display_string .= "</tr>";
while($row = mysql_fetch_array($qry_result)){
$display_string .= "<tr>";
$display_string .= "<td>$row[name]</td>";
$display_string .= "<td>$row[age]</td>";
$display_string .= "<td>$row[sex]</td>";
$display_string .= "<td>$row[wpm]</td>";
$display_string .= "</tr>";
$display_string .= "</table>";
echo $display_string;
?>