一個客戶端事件發生
創建一個XMLHttpRequest對象
XMLHttpRequest對象配置
XMLHttpRequest對象異步請求到Web服務器.
Web服務器返回的結果包含XML文檔.
XMLHttpRequest對象調用callback()函數和處理結果。
HTML DOM更新
讓我們逐一采取以下步驟
一個JavaScript函數被稱為事件的結果
例如:validateUserId()是JavaScript函數被映射為一個事件處理程序上輸入表單域的onkeyup事件,其ID設置為“用戶ID”
<input type="text" size="20" id="userid" name="id" onkeyup="validateUserId();">
var ajaxRequest; // The variable that makes Ajax possible! function ajaxFunction(){ try{ // Opera 8.0+, Firefox, Safari ajaxRequest = new XMLHttpRequest(); }catch (e){ // Internet Explorer Browsers try{ ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); }catch (e) { try{ ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); }catch (e){ // Something went wrong alert("Your browser broke!"); return false; } } } }
在這一步,我們將寫一個將客戶端事件觸發的函數和一個回調函數processRequest()將被注冊。
function validateUserId() {
ajaxFunction(); // Here processRequest() is the callback function. ajaxRequest.onreadystatechange = processRequest;
if (!target) target = document.getElementById("userid");
var url = "validate?id=" + escape(target.value);
ajaxRequest.open("GET", url, true);
ajaxRequest.send(null);
}
源代碼是在一塊上麵的代碼。寫在藍色代碼是負責使Web服務器的請求。這是所有正在使用XMLHttpRequest對象ajaxRequest
function validateUserId() { ajaxFunction(); // Here processRequest() is the callback function. ajaxRequest.onreadystatechange = processRequest; if (!target) target = document.getElementById("userid"); var url = "validate?id=" + escape(target.value); ajaxRequest.open("GET", url, true); ajaxRequest.send(null); }
假設,如果你輸入用戶ID框中mohammad在上述請求的URL,然後設置tovalidate?ID=mohammad
在任何一種語言,你可以實現你的服務器端腳本。但邏輯應該如下
從客戶端獲取請求
解析從客戶端輸入
你所需的處理
將輸出發送到客戶端.
如果我們假設你要編寫一個servlet,那麼這裡是一段代碼
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String targetId = request.getParameter("id"); if ((targetId != null) && !accounts.containsKey(targetId.trim())) { 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"); } }
配置XMLHttpRequest對象調用processRequest()函數,當有一個狀態變化到XMLHttpRequest對象的readyState。現在,這個函數將收到從服務器的結果,將不所需處理。在下麵的例子,它設置一個真或假的變量的消息返回值是從網絡服務器上的.
function processRequest() { if (req.readyState == 4) { if (req.status == 200) { var message = ...; ... }
這是最後一步,這一步在你的HTML頁麵將被更新。它發生在下列方式:
獲得一個元素的參考推薦的方法是調用.
document.getElementById("userIdMessage"),
// where "userIdMessage" is the ID attribute
// of an element appearing in the HTML document
現在,JavaScript技術可能被用來修改元素的屬性,修改元素的樣式屬性,或添加,刪除,或修改子元素。下麵是例子
<script type="text/javascript">
<!--
function setMessageUsingDOM(message) {
var userMessageElement =
document.getElementById("userIdMessage");
var messageText;
if (message == "false") {
userMessageElement.style.color = "red";
messageText = "Invalid User Id";
} else {
userMessageElement.style.color = "green";
messageText = "Valid User Id";
}
var messageBody = document.createTextNode(messageText); // if the messageBody element has been created simple
// replace it otherwise append the new element if (userMessageElement.childNodes[0]) {
userMessageElement.replaceChild(messageBody,
userMessageElement.childNodes[0]);
} else {
userMessageElement.appendChild(messageBody);
}
}
-->
</script>
<body>
<div id="userIdMessage"><div>
</body>
如果你了解上述七個步驟,那麼你幾乎使用AJAX。在下一章中,我們將看到更詳細的XMLHttpRequest對象.