AJAX - XMLHttpRequest
Đối tượng XMLHttpRequest được sử dụng để yêu cầu dữ liệu từ máy chủ.
Gửi yêu cầu đến máy chủ
Để gửi yêu cầu đến máy chủ, chúng tôi sử dụng phương thức open () và send () của XMLHttpRequest
đối tượng:
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
Method | Description |
---|---|
open(method, url, async) | Specifies the type of request method: the type of request: GET or POST url: the server (file) location async: true (asynchronous) or false (synchronous) |
send() | Sends the request to the server (used for GET) |
send(string) | Sends the request to the server (used for POST) |
Url - Tệp trên máy chủ
Tham số url của open()
phương thức, là một địa chỉ đến một tệp trên máy chủ:
xhttp.open("GET", "ajax_test.asp", true);
Tệp có thể là bất kỳ loại tệp nào, như .txt và .xml hoặc tệp kịch bản máy chủ như .asp và .php (có thể thực hiện các hành động trên máy chủ trước khi gửi phản hồi trở lại).
Không đồng bộ - Đúng hay Sai?
Yêu cầu máy chủ phải được gửi không đồng bộ.
Tham số async của phương thức open () phải được đặt thành true:
xhttp.open("GET", "ajax_test.asp", true);
Bằng cách gửi không đồng bộ, JavaScript không phải đợi phản hồi của máy chủ mà thay vào đó có thể:
- thực thi các tập lệnh khác trong khi chờ phản hồi của máy chủ
- xử lý phản hồi sau khi phản hồi đã sẵn sàng
Giá trị mặc định cho tham số async là async = true.
Bạn có thể xóa tham số thứ ba một cách an toàn khỏi mã của mình.
Không nên sử dụng XMLHttpRequest đồng bộ (async = false) vì JavaScript sẽ ngừng thực thi cho đến khi phản hồi của máy chủ sẵn sàng. Nếu máy chủ bận hoặc chậm, ứng dụng sẽ bị treo hoặc dừng.
NHẬN hay ĐĂNG?
GET
đơn giản hơn và nhanh hơn POST
và có thể được sử dụng trong hầu hết các trường hợp.
Tuy nhiên, luôn sử dụng yêu cầu ĐĂNG khi:
- Tệp được lưu trong bộ nhớ cache không phải là một tùy chọn (cập nhật tệp hoặc cơ sở dữ liệu trên máy chủ).
- Gửi một lượng lớn dữ liệu đến máy chủ (POST không có giới hạn về kích thước).
- Gửi thông tin đầu vào của người dùng (có thể chứa các ký tự không xác định), POST mạnh mẽ và an toàn hơn GET.
NHẬN Yêu cầu
Một GET
yêu cầu đơn giản:
Thí dụ
xhttp.open("GET", "demo_get.asp");
xhttp.send();
Trong ví dụ trên, bạn có thể nhận được một kết quả được lưu trong bộ nhớ cache. Để tránh điều này, hãy thêm một ID duy nhất vào URL:
Thí dụ
xhttp.open("GET", "demo_get.asp?t=" + Math.random());
xhttp.send();
Nếu bạn muốn gửi thông tin bằng GET
phương thức này, hãy thêm thông tin vào URL:
Thí dụ
xhttp.open("GET", "demo_get2.asp?fname=Henry&lname=Ford");
xhttp.send();
Cách máy chủ sử dụng đầu vào và cách máy chủ phản hồi một yêu cầu, sẽ được giải thích trong chương sau.
ĐĂNG yêu cầu
Một POST
yêu cầu đơn giản:
Thí dụ
xhttp.open("POST", "demo_post.asp");
xhttp.send();
Để ĐĂNG dữ liệu như biểu mẫu HTML, hãy thêm tiêu đề HTTP với setRequestHeader()
. Chỉ định dữ liệu bạn muốn gửi trong send()
phương thức:
Thí dụ
xhttp.open("POST", "ajax_test.asp");
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("fname=Henry&lname=Ford");
Method | Description |
---|---|
setRequestHeader(header, value) | Adds HTTP headers to the request header: specifies the header name value: specifies the header value |
Yêu cầu đồng bộ
Để thực hiện một yêu cầu đồng bộ, hãy thay đổi tham số thứ ba trong open()
phương thức thành false
:
xhttp.open("GET", "ajax_info.txt", false);
Đôi khi async = false được sử dụng để kiểm tra nhanh. Bạn cũng sẽ tìm thấy các yêu cầu đồng bộ trong mã JavaScript cũ hơn.
Vì mã sẽ đợi máy chủ hoàn thành nên không cần onreadystatechange
hàm:
Thí dụ
xhttp.open("GET", "ajax_info.txt", false);
xhttp.send();
document.getElementById("demo").innerHTML = xhttp.responseText;
Không nên sử dụng XMLHttpRequest đồng bộ (async = false) vì JavaScript sẽ ngừng thực thi cho đến khi phản hồi của máy chủ sẵn sàng. Nếu máy chủ bận hoặc chậm, ứng dụng sẽ bị treo hoặc dừng.
Các công cụ dành cho nhà phát triển hiện đại được khuyến khích để cảnh báo về việc sử dụng các yêu cầu đồng bộ và có thể đưa ra ngoại lệ InvalidAccessError khi nó xảy ra.