什么是Ajax與Ajax原生的實現方式


一、什么是Ajax?

  Aiax:異步的Javascript和XML。

作用:用於完成局部刷新

XML是用於數據傳輸,現在開始被JSON所替代。

function hello(){
		//1.拿到一個Ajax對象
		var xhr = new XMLHttpRequest();
		//2.open方法:創建一個新的http請求,並指定此請求的方法、URL以及驗證信息
		//  准備請求的信息(方式,地址,...)
		/**
			open(bstrMethod, bstrUrl, varAsync)
				bstrMethod:准備請求的方式(GET/POST)
				bstrUrl:准備請求的地址(路徑)
				varAsync:是否異步(true就是異步【默認】 ,false就是同步)
		*/
		xhr.open("GET","/hello");
		//3.發送相當的請求
		xhr.send();
	}

  

1.1、交互方式問題

  傳統的交互方式每次都必須返回整個頁面,寬帶,響應速度都有影響的,

  Ajax的交互方式是從

客戶端(瀏覽器)從服務器加載網頁完畢后,網頁中的內容如果需要更改,不使用瀏覽器發送請求,而是使用JavaScript中的XMLHttpRequest(及Ajax對象)對象發送請求到服務器,服務器接收請求並處理完畢后只返回頁面需要的內容,XMLHttpRequest對象接收服務器返回的內容,程序員需要手動(javascript)的把內容更新到頁面中,所有Ajax交互的好處是只是部分數據的更新,就成功和服務器進行了交互,提高用戶的體驗。

1.2、使用場景

  需要刷新的頁面,如(瀏覽器地圖搜素、自動提示、用戶重復檢查、購物車、用戶登錄等.....)都需要用到Ajax交互。

1.3、Ajax的特點

  通過Ajax與服務器進行數據交換,Ajax可以使網頁實現局部更新,意味着可以在不重新加載整個頁面的情況下,對網頁的某個部分進行更新 

1.4、Ajax核心

  Ajax的核心是JavaScript對象XMLHttpRequest。簡單的說 XMLHttpRequest可以讓你使用JavaScript向服務器進行請求並處理響應。

1.5、同步與異步的區別

 

  同步:提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事

 

  異步: 請求通過事件觸發->服務器處理(這時瀏覽器仍然可以作其他事情)->處理完畢

 

同步是指:發送方發出數據后,等接收方發回響應以后才發下一個數據包的通訊方式。

 

異步是指:發送方發出數據后,不等接收方發回響應,接着發送下個數據包的通訊方式

 

 

二、Ajax原生的實現方式

  xhr = new XMLHttpRequest() : 通過new它可以創建一個ajax對象【兼容IE需要創建ActiveXObject】

2.1、方法(函數)
  xhr.open(methodType,methodUrl,isSys) -> 准備請求的方式與路徑
  methodType:請求的方式(GET/POST)
  methodUrl:請求的路徑
  isSys:是否異步(默認為true)
  xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  設置請求頭的一個類型,如果是POST請求,一定要加這一句,才可以把數據傳到后台
  位置:open之后,send之前
  xhr.send(varBody) -> 發送請求
  varBody:POST請求傳參(key=value&key=value&...)
2.2、 屬性
xhr.status -> 請求狀態(200代表成功)
xhr.readyState -> 響應狀態(4代表響應完成)
xhr.responseText -> 獲取返回的數據(字符串)

  

  /**
  從Ajax對象(xhr)創建開始,它的所有操作都被監聽
  xhr本身是有一個狀態的概念,這個狀態:readyState
  0 (未初始化) 對象已建立,但是尚未初始化(尚未調用open方法)
  1 (初始化) 對象已建立,尚未調用send方法
  2 (發送數據) send方法已調用,但是當前的狀態及http頭未知
  3 (數據傳送中) 已接收部分數據,因為響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤,
  4 (完成) 數據接收完畢,此時可以通過通過responseBody和responseText獲取完整的回應數據
  */

function getTime(){
		//1.獲取ajax對象
		var xhr = new XMLHttpRequest();
		//2.准備請求(方式,路徑)
		xhr.open("get","/gettime");
		//3.監聽ajax的狀態
		xhr.onreadystatechange = function(){
			//4.如果請求狀態為200,響應狀態為4
			if(xhr.status==200 && xhr.readyState==4){
				//5.獲取相應的值
				var result = xhr.responseText;
				//放到相應的位置
				document.getElementById("time").innerHTML = result;
			}
		}
		//6.發送請求
		xhr.send();
	}

2.3、事件
xhr.onreadystatechange =function(){} -> 監聽readyState狀態的變化

三、注意點

  使用Ajax請求,后台不進行跳轉,只做數據的傳輸

返回的值都是字符串,需要自己做相當的判斷與轉換

四、JSON:JS的對象 對象/字符串

json傳輸數據比XML更加方便,簡單,精簡
var jsonStr = {}/[];
如果把一個json字符串轉成json對象呢?
eval("("+jsonStr+")") -> 前后加括號
JSON.parse(jsonStr) -> 必需是標准的json(key必需有雙引號)

 

function login(){
		//1.獲取到用戶名與密碼
		var username = document.getElementById("username").value;
		var password = document.getElementById("password").value;
		//2.創建ajax對象
		var xhr = new XMLHttpRequest();
		//3.准備請求的方式與路徑 /login?username=xxx&password=xx
		//  get請求在路徑中傳參,POST請求在send中傳參
		xhr.open("post","/login");
		//  如果是post請求,必需設計請求頭的類型,后台才可以拿到相應的數據
		xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		
		//監聽相當的事件
		xhr.onreadystatechange = function(){
			if(xhr.status==200 && xhr.readyState==4){
				//返回的  ”true" 與 "false"
				// responseText拿到的都是字符串
				var result = xhr.responseText;
				if(result=="true"){
					//alert("登錄成功了!");
					window.location.href="https://www.baidu.com/";
				}else{
					//alert("登錄失敗了!");
					document.getElementById("errorSpan").innerHTML ="用戶名或者密碼錯誤!";
				}
			}
		}
		//4.發送請求(send里面加上發送的數據)
		xhr.send("username="+username+"&password="+password);
	}
</script>

</head>
<body>

<span id="errorSpan"></span>
<form action="/login" method="post">
	用戶名:<input type="text" name="username" id="username" /> <br />
	密碼<input type="text" name="password" id="password" /><br />
	<input type="button" value="ajax提交" onclick="login()" />
	<input type="submit" value="直接提交"  />
</form>

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM