AJAX——百聞不如一見

泰斗賢若如發表於2019-06-01

AJAX

一、AJAX簡介

  • 什麼是 AJAX ?

AJAX = 非同步 JavaScript 和 XML。

AJAX 是一種用於建立快速動態網頁的技術。

通過在後臺與伺服器進行少量資料交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

傳統的網頁(不使用 AJAX)如果需要更新內容,必需過載整個網頁面。

有很多使用 AJAX 的應用程式案例:新浪微博、Google 地圖、開心網等等。

 

二、AJAX 工作原理

 

三、AJAX是基於現有的Internet標準

  • (Ajax:只重新整理區域性頁面的技術) 包括以下幾種技術: 

AJAX是基於現有的Internet標準,並且聯合使用它們:

  • XMLHttpRequest 物件 (非同步的與伺服器交換資料)
  • JavaScript/DOM (資訊顯示/互動)
  • CSS (給資料定義樣式)
  • XML (作為轉換資料的格式)

非同步:傳送請求後不等待返回結果,由回撥函式處理結果。

AJAX應用程式與瀏覽器和平臺無關的!

 

 

四、ajax傳送非同步請求

  • 第一步:得到XMLHttpRequest物件

ajax其實只需要用到一個物件:XMLHttpRequest,編寫建立XMLHttpRequest物件的函式

 

建立 XMLHttpRequest 物件的語法:

variable=new XMLHttpRequest();

  

  • 第二步:開啟與伺服器的連線

mxlHttp.open();用來開啟與伺服器的連線,需要三個引數:

請求方式,可以是EGT或POST;

請求的URL,指定伺服器端資源,例如:/oa/AServlet;

請求是否為非同步,true為非同步請求,false為同步請求

例如:xmlHttp.open("GET","/oa/AServlet",true);

  • 第三步:傳送請求

xmlHttp.send(null);引數為請求體,如果是GET請求,引數為null,如果傳引數可能會造成部分瀏覽器無法傳送

如需將請求傳送到伺服器,我們使用 XMLHttpRequest 物件的 open() 和 send() 方法:

xmlhttp.open("GET","ajax_info.txt",true);
xmlhttp.send();

  

       

 

       

       

 

     

 

方法:
  open()  該方法有3個引數,"get|post","url?name=tom","true|false",預設為true。
  send() 傳送請求,可以帶引數 或 null。
  setRequestHeader() 設定請求訊息頭。
屬性:
  readyState  型別為short,只讀
  responseText  型別為String,只讀
  responseXML  型別為Document,只讀(一般不用)
  status  型別為short,只讀
事件處理器:
  onreadystatechange

  • GET 還是 POST

與 POST 相比,GET 更簡單也更快,並且在大部分情況下都能用。

然而,在以下情況中,請使用 POST 請求:

  • 無法使用快取檔案(更新伺服器上的檔案或資料庫)
  • 向伺服器傳送大量資料(POST 沒有資料量限制)
  • 傳送包含未知字元的使用者輸入時,POST 比 GET 更穩定也更可靠

 

 

  • 第四步:註冊監聽器

在xmlHttp物件的一個事件上註冊監聽器:onreadystatechange

xmlHttp物件一共有5個狀態:

  •   0狀態:剛建立,還沒有呼叫open()方法;
  •   1狀態:請求開始,呼叫open()方法,但是沒有呼叫send()方法;
  •   2狀態:呼叫完了send()方法;
  •   3狀態:伺服器已經開始響應,但是響應未結束;
  •   4狀態:伺服器響應結束;

得到xmlHttp物件的狀態:

var state = xmlHttp.readyState;//狀態為:0/1/2/3

得到伺服器響應的狀態碼:

var status = xmlHttp.status;//狀態碼:200/404/500

得到伺服器響應的內容:

var content = xmlHttp.responseText;//得到伺服器的響應的文字格式內容

var content = xmlHttp.responseXML;//得到伺服器響應的xml內容,可以使用Document物件解析

 

五、例項:非同步提交GET請求

	<script type="text/javascript">
		//獲得XMLHttpRequest物件
		function createXMLHttpRequest(){
			try{
				//大部分瀏覽器支援
				return new XMLHttpRequest;
			}catch(e){
				try{
					//支援IE6.0
					return new ActiveXObject("Msxm12.XMLHTTP");
				}catch(e){
					try{
						//支援IE5更早版本
						return new ActiveXObject("Microsoft.XMLHTTP");
					}catch(e){
						throw e;
					}
				}
			}
		}
		
		function dianji(){
			//1.得到非同步物件
			var xmlHttp = createXMLHttpRequest();
			//2.開啟伺服器連線
			xmlHttp.open("GET","<c:url value='/AServlet' />",true);
			//3.傳送請求
			xmlHttp.send(null);
			//4.註冊監聽
			xmlHttp.onreadystatechange = function(){
				//判斷響應狀態和狀態碼
				if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
					//獲取響應內容
					var text = xmlHttp.responseText;
					//獲取標籤元素
					var cont = document.getElementById("content");
					cont.innerHTML = text;
				}
			};
		}
		
	</script>
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("獲得非同步請求");
		response.getWriter().println("hello world");
	}

  

六、例項:傳送POST請求,伺服器響應XML

設定Content-Type請求頭:

xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

傳送請求時指定的請求體

xmlHttp.send("username=tom&password=123");

	<script type="text/javascript">
		//獲得XMLHttpRequest物件
		function createXMLHttpRequest(){
			try{
				//大部分瀏覽器支援
				return new XMLHttpRequest;
			}catch(e){
				try{
					//支援IE6.0
					return new ActiveXObject("Msxm12.XMLHTTP");
				}catch(e){
					try{
						//支援IE5更早版本
						return new ActiveXObject("Microsoft.XMLHTTP");
					}catch(e){
						throw e;
					}
				}
			}
		}
		
		function dianji(){
			//1.得到非同步物件
			var xmlHttp = createXMLHttpRequest();
			//2.開啟伺服器連線
			xmlHttp.open("POST","<c:url value='/AServlet' />",true);
			//3.設定請求頭請求
			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			xmlHttp.send("username=張三&password=123");
			//4.註冊監聽
			xmlHttp.onreadystatechange = function(){
				//判斷響應狀態和狀態碼
				if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
					//獲取響應內容
					var rel = xmlHttp.responseXML;
					//獲取標籤元素
					var userele = rel.getElementsByTagName("user")[0];
					var nameele = rel.getElementsByTagName("username")[0].innerHTML;
					var pwdele = rel.getElementsByTagName("password")[0].innerHTML;
					
					var str = "賬號:"+nameele+",密碼:"+pwdele;
					
					var cont = document.getElementById("content");
					cont.innerHTML = str;
				}
			};
		}
		
	</script>
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("post請求。。。");
		// 設定請求響應的編碼
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/xml;charset=utf-8");

		// 獲取引數
		String name = request.getParameter("username");
		String pwd = request.getParameter("password");

		// 封裝為xml
		String xml = "<user>" + "<username>" + name + "</username>"
				+ "<password>" + pwd + "</password>" + "</user>";
		System.out.println(xml);
		response.getWriter().println(xml);
	}

  

七、菜鳥例項

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function loadXMLDoc()
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {
        //  IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        // IE6, IE5 瀏覽器執行程式碼
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
    xmlhttp.send();
}
</script>
</head>
<body>
​
<div id="myDiv"><h2>使用 AJAX 修改該文字內容</h2></div>
<button type="button" onclick="loadXMLDoc()">修改內容</button>
​
</body>
</html>

  

 

參考案例:

 <script type="text/javascript">
        // 方式1
        function ckName() {
            // 獲取使用者名稱物件
            var name = document.getElementsByTagName("input")[0];
            // 建立XMLHttpRequest物件
            var xhr = getXMLHttpRequest();
            // 處理響應結果,建立回撥函式,根據響應狀態動態更新頁面
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4) { // 說明客戶端請求一切正常
                    if (xhr.status == 200) { // 說明伺服器響應一切正常
                        // alert(xhr.responseText); // 得到響應結果
                        var msg = document.getElementById("msg");
                        if (xhr.responseText == "true") {
                            // msg.innerText = "使用者名稱已存在";
                            msg.innerHTML = "<font color='red'>該使用者名稱已存在</font>";
                        } else {
                            msg.innerHTML = "<font color='green'>該使用者名稱可以使用</font>";
                        }
                    }
                }
            }            
            // 建立一個連線
            xhr.open("get", "${pageContext.request.contextPath }/servlet/ckNameServlet?name=" + name.value);
            // 傳送請求
            xhr.send(null);
        }
        
        // 方式2
        window.onload = function() {
            var nameElement = document.getElementsByName("userName")[0];
            nameElement.onblur = function() {
                var name = this.value; // this等價於nameElement
                
                // 建立XMLHttpRequest物件
                var xhr = getXMLHttpRequest();
                // 處理響應結果,建立回撥函式,根據響應狀態動態更新頁面
                xhr.onreadystatechange = function() {
                    if (xhr.readyState == 4) { // 說明客戶端請求一切正常
                        if (xhr.status == 200) { // 說明伺服器響應一切正常
                            // alert(xhr.responseText); // 得到響應結果
                            var msg = document.getElementById("msg");
                            if (xhr.responseText == "true") {
                                // msg.innerText = "該使用者名稱已存在";
                                msg.innerHTML = "<font color='red'>該使用者名稱已存在</font>";
                            } else {
                                msg.innerHTML = "<font color='green'>該使用者名稱可以使用</font>";
                            }
                        }
                    }
                }            
                // 建立一個連線
                xhr.open("get", "${pageContext.request.contextPath }/servlet/ckNameServlet?name=" + name + "&time=" + new Date().getTime());
                // 傳送請求
                xhr.send(null);
            }
        }
    </script>

  

 Java匹馬行天下依舊在更新中,歡迎大家關注,感覺可以的可以點選一下推薦,如若有誤,感謝指正,歡迎討論,謝謝!

相關文章