XML DOM - Đối tượng XMLHttpRequest

Đối tượng XMLHttpRequest

Đối tượng XMLHttpRequest cung cấp quyền truy cập đầy đủ vào giao thức HTTP, bao gồm khả năng gửi yêu cầu POST và HEAD cũng như yêu cầu GET thông thường. XMLHttpRequest có thể trả về phản hồi từ máy chủ web một cách đồng bộ hoặc bất đồng bộ, và có thể trả về nội dung dưới dạng văn bản hoặc một tài liệu DOM.

Mặc dù có tên là XMLHttpRequest, nó không giới hạn trong việc sử dụng cùng với tài liệu XML: nó có thể nhận bất kỳ định dạng tài liệu văn bản nào.

đối tượng XMLHttpRequest được gọi là AJAX một tính năng quan trọng của cấu trúc ứng dụng web.

hỗ trợ trình duyệt

XMLHttpRequest được hỗ trợ tốt bởi hầu hết các trình duyệt hiện đại. Độc đáo, sự phụ thuộc duy nhất liên quan đến việc tạo đối tượng XMLHttpRequest. Trong IE 5 và IE 6, bạn phải sử dụng hàm xây dựng riêng cho IE là ActiveXObject(). Như đã đề cập trong Đối tượng XMLHttpRequest Phần này giới thiệu.

Tiêu chuẩn hóa W3C

Đối tượng XMLHttpRequest chưa được tiêu chuẩn hóa, nhưng W3C đã bắt đầu công việc tiêu chuẩn hóa, nội dung được giới thiệu trong cuốn sách này dựa trên công việc dự thảo tiêu chuẩn hóa.

Thực hiện hiện tại của XMLHttpRequest đã tương đối nhất quán. Nhưng có một số khác biệt tinh vi so với tiêu chuẩn. Ví dụ, một thực hiện có thể trả về null, trong khi tiêu chuẩn yêu cầu là chuỗi rỗng, hoặc thực hiện có thể đặt readyState thành 3 mà không đảm bảo rằng tất cả các phần đầu phản hồi đều có sẵn.

Thuộc tính

readyState

Trạng thái yêu cầu HTTP. Khi XMLHttpRequest được tạo lần đầu tiên, giá trị của thuộc tính này bắt đầu từ 0, cho đến khi nhận được phản hồi HTTP hoàn chỉnh, giá trị này tăng lên đến 4.

Mỗi trạng thái trong 5 trạng thái đều có một tên không chính thức liên quan, bảng dưới đây liệt kê trạng thái, tên và ý nghĩa:

Trạng thái Tên Mô tả
0 Uninitialized Trạng thái khởi tạo. Đối tượng XMLHttpRequest đã được tạo hoặc đã được đặt lại bằng phương thức abort().
1 Open Phương thức open() đã được gọi, nhưng phương thức send() chưa được gọi. Yêu cầu chưa được gửi.
2 Sent Phương thức Send() đã được gọi, yêu cầu HTTP đã được gửi đến máy chủ Web. Chưa nhận được phản hồi.
3 Receiving Tất cả các phần đầu phản hồi đã nhận được. Thân phản hồi bắt đầu nhận nhưng chưa hoàn thành.
4 Loaded Phản hồi HTTP đã nhận được hoàn toàn.

Giá trị của readyState sẽ không giảm trừ khi một yêu cầu trong quá trình xử lý gọi phương thức abort() hoặc open(). Mỗi khi giá trị của thuộc tính này tăng lên, sự kiện onreadystatechange sẽ được kích hoạt.

responseText

Phần thân phản hồi đã nhận được từ máy chủ (không bao gồm phần đầu), hoặc nếu chưa nhận được dữ liệu, thì là chuỗi rỗng.

Nếu readyState nhỏ hơn 3, thuộc tính này là một chuỗi rỗng. Khi readyState là 3, thuộc tính này trả về phần phản hồi đã nhận được. Nếu readyState là 4, thuộc tính này lưu trữ thân phản hồi hoàn chỉnh.

Nếu phản hồi chứa phần đầu chứa mã hóa ký tự được chỉ định cho thân phản hồi, hãy sử dụng mã hóa đó. Nếu không, giả sử sử dụng Unicode UTF-8.

responseXML

Đối với phản hồi yêu cầu, phân tích thành XML và sử dụng như Đối tượng Documenttrả về.

status

bởi máy chủ trả về Mã trạng thái HTTP, chẳng hạn như 200 để chỉ thị thành công, trong khi 404 để chỉ thị lỗi "Not Found" . Việc đọc thuộc tính này khi readyState nhỏ hơn 3 sẽ gây ra một ngoại lệ.

statusText

Thuộc tính này sử dụng tên thay vì số để chỉ định mã trạng thái HTTP của yêu cầu. Đ换句话说, khi trạng thái là 200 thì nó là "OK", khi trạng thái là 404 thì nó là "Not Found". Giống như thuộc tính status, việc đọc thuộc tính này khi readyState nhỏ hơn 3 sẽ gây ra một ngoại lệ.

Hàm xử lý sự kiện

onreadystatechange

Hàm xử lý sự kiện được gọi mỗi khi thuộc tính readyState thay đổi. Khi readyState là 3, nó cũng có thể được gọi nhiều lần.

Phương thức

abort()

Hủy bỏ phản hồi hiện tại, đóng kết nối và kết thúc tất cả các hoạt động mạng đang chờ xử lý.

Phương thức này đặt lại đối tượng XMLHttpRequest thành trạng thái readyState là 0 và hủy bỏ tất cả các hoạt động mạng đang chờ xử lý. Ví dụ, nếu yêu cầu sử dụng quá lâu và phản hồi không còn cần thiết, bạn có thể gọi phương thức này.

getAllResponseHeaders()

Trả về phần đầu HTTP HTTP dưới dạng chuỗi chưa được phân tích.

Nếu readyState nhỏ hơn 3, phương thức này trả về null. Ngược lại, nó trả về tất cả các phần đầu HTTP HTTP được gửi bởi máy chủ. Các phần đầu được trả về dưới dạng một chuỗi duy nhất, một phần đầu một dòng. Mỗi dòng được ngăn cách bởi ký tự换行 "\r\n".

getResponseHeader()

Trả về giá trị của phần đầu HTTP HTTP được chỉ định. Tham số là tên của phần đầu HTTP cần trả về. Bạn có thể sử dụng bất kỳ cỡ chữ nào để chỉ định tên phần đầu này, và việc so sánh với phần đầu phản hồi không phân biệt cỡ chữ.

Giá trị trả về của phương thức này là giá trị của phần đầu HTTP HTTP được chỉ định, nếu không nhận được phần đầu này hoặc readyState nhỏ hơn 3 thì là chuỗi rỗng. Nếu nhận được nhiều phần đầu có tên được chỉ định, giá trị của phần đầu này sẽ được kết nối lại và trả về, sử dụng dấu phẩy và khoảng trống để phân cách các giá trị của các phần đầu.

open()

Khởi tạo các tham số yêu cầu HTTP, chẳng hạn như URL và phương thức HTTP, nhưng không gửi yêu cầu.

send()

Gửi yêu cầu HTTP, sử dụng các tham số được truyền vào phương thức open() và thể yêu cầu tùy chọn được truyền vào phương thức này.

setRequestHeader()

Cài đặt hoặc thêm một yêu cầu HTTP cho một yêu cầu đã mở nhưng chưa gửi.

XMLHttpRequest.open()

Khởi tạo các tham số yêu cầu HTTP

Cú pháp

open(method, url, async, username, password)

Tham số method là phương pháp HTTP được sử dụng cho yêu cầu. Các giá trị bao gồm GET, POST và HEAD.

Tham số url là phần chủ thể của yêu cầu. Hầu hết các trình duyệt thực hiện một chính sách bảo mật của nguồn và yêu cầu rằng URL này phải có cùng tên máy và cổng với văn bản chứa script.

Tham số async chỉ ra rằng yêu cầu nên được thực hiện theo cách đồng bộ. Nếu tham số này là false, yêu cầu sẽ là đồng bộ, các gọi đến send() sẽ bị chặn cho đến khi phản hồi hoàn toàn được nhận. Nếu tham số này là true hoặc được bỏ qua, yêu cầu sẽ là đồng bộ, và thường cần một bộ xử lý sự kiện onreadystatechange.

Các tham số username và password là tùy chọn, cung cấp quyền xác thực cho quyền cần thiết của url. Nếu được chỉ định, chúng sẽ thay thế bất kỳ quyền nào được chỉ định bởi url.

Giải thích

Phương pháp này khởi tạo các tham số yêu cầu để sử dụng cho phương pháp send() sau này. Nó đặt readyState thành 1, xóa tất cả các đầu đề yêu cầu đã chỉ định trước đó, cũng như tất cả các đầu đề phản hồi đã nhận được trước đó, và đặt các tham số responseText, responseXML, status và statusText thành giá trị mặc định của chúng. Khi readyState là 0 (khi đối tượng XMLHttpRequest được tạo hoặc phương pháp abort() được gọi) và khi readyState là 4 (đã nhận phản hồi), gọi phương pháp này là an toàn. Khi gọi phương pháp này đối với bất kỳ trạng thái nào khác, hành vi của phương pháp open() sẽ được xác định.

Ngoài việc lưu trữ các tham số yêu cầu để sử dụng cho phương pháp send(), và đặt lại đối tượng XMLHttpRequest để có thể tái sử dụng, phương pháp open() không có hành vi khác. Cần chú ý đặc biệt, khi phương pháp này được gọi, thực hiện thường sẽ không mở một kết nối mạng đến máy chủ Web.

XMLHttpRequest.send()

Gửi một yêu cầu HTTP

Cú pháp

send(body)

Nếu phương pháp HTTP được chỉ định bởi việc gọi open() là POST hoặc PUT, tham số body xác định thể yêu cầu, dưới dạng một chuỗi hoặc Đối tượng DocumentNếu không cần thiết phải có thể, tham số này sẽ là null. Đối với bất kỳ phương pháp nào khác, tham số này không thể sử dụng được và nên là null (certain implementations không cho phép bỏ qua tham số này).

Giải thích

Phương thức này dẫn đến việc gửi một yêu cầu HTTP. Nếu chưa gọi phương thức open() trước đó, hoặc nói cách khác, nếu trạng thái readyState không phải là 1, send() sẽ ném một ngoại lệ. Ngược lại, nó sẽ gửi một yêu cầu HTTP, bao gồm các phần sau:

  • Phương thức HTTP, URL và quyền xác thực đã được chỉ định trước đó bởi phương thức open() (nếu có).
  • Đầu yêu cầu đã được chỉ định trước đó bởi phương thức setRequestHeader() (nếu có).
  • Truyền vào phương thức này body Tham số.

Một khi yêu cầu được phát hành, send() sẽ đặt trạng thái readyState thành 2 và kích hoạt bộ xử lý sự kiện onreadystatechange.

Nếu tham số async của phương thức trước đó gọi open() là false, phương thức này sẽ bị chặn và không trả về, cho đến khi trạng thái readyState là 4 và phản hồi của máy chủ được nhận hoàn toàn. Ngược lại, nếu tham số async là true hoặc tham số này được bỏ qua, send() sẽ trả về ngay lập tức, và như được giới thiệu sau này, phản hồi của máy chủ sẽ được xử lý trong một luồng nền.

Nếu phản hồi của máy chủ chứa một HTTP重定向,phương thức send() hoặc luồng nền tự động tuân theo重定向. Khi tất cả các đầu phản hồi HTTP đã được nhận, send() hoặc luồng nền sẽ đặt trạng thái readyState thành 3 và kích hoạt bộ xử lý sự kiện onreadystatechange. Nếu phản hồi dài, send() hoặc luồng nền có thể kích hoạt bộ xử lý sự kiện onreadystatechange ở trạng thái 3: điều này có thể được sử dụng làm chỉ báo tiến độ tải xuống. Cuối cùng, khi phản hồi hoàn thành, send() hoặc luồng nền sẽ đặt trạng thái readyState thành 4 và kích hoạt bộ xử lý sự kiện một lần cuối.

XMLHttpRequest.setRequestHeader()

Cú pháp

setRequestHeader(name, value)

Tham số name là tên của đầu cần thiết lập. Tham số này không nên bao gồm khoảng trống, dấu chấm phẩy hoặc dòng mới.

Tham số value là giá trị của đầu. Tham số này không nên bao gồm dòng mới.

Giải thích

Phương thức setRequestHeader() chỉ định đầu của yêu cầu HTTP, nó nên được bao gồm trong yêu cầu được phát hành qua lệnh send() sau này. Phương thức này chỉ có thể được gọi khi trạng thái readyState là 1, ví dụ, sau khi gọi open(), nhưng trước khi gọi send().

Nếu đầu đã được chỉ định với tên cụ thể, giá trị mới của đầu này là: giá trị đã chỉ định trước đó, cộng với dấu phẩy, khoảng trống và giá trị được chỉ định bởi lệnh này.

Nếu gọi open() xác định quyền认证资格, XMLHttpRequest tự động gửi một đầu đề yêu cầu Authorization thích hợp. Tuy nhiên, bạn có thể sử dụng setRequestHeader() để thêm đầu đề này. Tương tự, nếu máy chủ web đã lưu và truyền cookie liên quan đến URL được truyền cho open(), đầu đề Cookie hoặc Cookie2 thích hợp cũng tự động được bao gồm trong yêu cầu. Bạn có thể gọi setRequestHeader() để thêm các cookie này vào đầu đề. XMLHttpRequest cũng có thể cung cấp giá trị mặc định cho đầu đề User-Agent. Nếu nó làm điều đó, bất kỳ giá trị nào bạn chỉ định cho đầu đề này sẽ được thêm vào giá trị mặc định đó.

Một số đầu đề yêu cầu được XMLHttpRequest tự động thiết lập而不是 được thiết lập bởi phương pháp này, để tuân thủ协议 HTTP. Điều này bao gồm các đầu đề liên quan đến proxy như sau:

  • Host
  • Connection
  • Keep-Alive
  • Accept-charset
  • Accept-Encoding
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • Range