AJAX (Asynchronous JavaScript and Xml)javascript
直譯中文 - javascript和XML的異步php
同步與異步的區別:
同步交互
執行速度相對比較慢
響應的是完整的HTML頁面
異步交互
執行速度相對比較快
響應的是部分數據java
Ajax 的核心對象:
XMLHttpRequest 對象
建立 XMLHttpReuqest 對象node
1 function getXhr(){ 2 // 聲明XMLHttpRequest對象 3 var xhr = null; 4 // 根據瀏覽器的不一樣狀況進行建立 5 if(window.XMLHttpRequest){ 6 // 表示除IE外的其餘瀏覽器 7 xhr = new XMLHttpRequest(); 8 }else{ 9 // 表示IE瀏覽器 10 xhr = new ActiveXObject('Microsoft.XMLHttp'); 11 } 12 return xhr; 13 } 14 // 建立核心對象 15 var xhr = getXhr();
Ajax 核心對象
屬性: json
* readyState
* 0 - (服務器端)還沒有初始化
* 1 - (服務器端)正在接收
* 2 - (服務器端)接收完畢
* 3 - (服務器端)正在響應
* 4 - (服務器端)響應完畢
* status
* 200 - 請求成功
* 404 - 網頁找不到(請求路徑不正確)
* 500 - 服務器端錯誤數組
方法:
* open(method,url)方法
* 做用 - 與服務器端創建鏈接
* 參數
* method - 設置請求類型(GET或POST)
* url - 設置請求地址
* send()方法
* 做用 - 向服務器端發送請求參數瀏覽器
事件:
* onreadystatechange事件
* 做用 - 監聽服務器端的通訊狀態改變服務器
實現Ajax的異步交互步驟
1. 建立XMLHttpRequest核心對象
固定寫法 - 獨立編寫
2. 與服務器端創建鏈接
使用XMLHttpRequest對象的open(method,url)方法
* method - 設置當前請求的類型
* url - 設置當前請求的地址
3. 向服務器端發送請求
使用XMLHttpRequest對象的send(請求參數)方法
* 請求參數的格式 - key=value
4. 接收服務器端的響應數據
* 使用XMLHttpRequest對象的onreadystatechange事件,監聽服務器端的通訊狀態
* 使用XMLHttpRequest對象的readyState屬性,判斷服務器端的當前狀態(0-4)
* 使用XMLHttpRequest對象的status屬性,判斷服務器端的狀態碼(200)
* 使用XMLHttpRequest對象的responseText屬性,接收服務器端的響應數據app
示例:異步
1 // 實現Ajax的異步交互的步驟 2 3 var btn = document.getElementById("btn"); 4 btn.onclick = function(){ 5 /* 6 * 1. 實現Ajax主要依靠XMLHttpRequest對象 7 * * 建立XMLHttpRequest對象 8 */ 9 var xhr = getXhr(); 10 /* 11 * 2. 與服務器端創建鏈接 12 * * open(method,url,async)方法 13 * * method - 設置當前的請求類型(GET或POST) 14 * * url - 設置當前的請求地址 15 * * async - 設置是否異步(Boolean類型) 16 * * 默認值爲true,表示異步 17 * * 官方認爲使用XMLHttpRequest對象就是爲了實現異步交互的 18 */ 19 xhr.open("get","01.php?user=zhangwuji"); 20 /* 21 * 3. 客戶端向服務器端發送請求 22 * * send(請求參數)方法 23 * * 請求參數的格式 - key=value 24 * * 若是請求類型爲GET方式的話 25 * * send()方法是不能向服務器端發送請求數據的 26 * * 注意 27 * * send()方法是不能被省略的 28 * * GET請求類型 - send(NULL); 29 */ 30 xhr.send(null); 31 /* 32 * 4. 客戶端接收服務器端的響應 33 * * 使用onreadystatechange事件 34 * * 監聽服務器的通訊狀態 35 * * readyState屬性 36 * * 獲得服務器端當前通訊狀態 37 * * 備選項 38 * * 0 還沒有初始化 39 * * 1 正在接收 40 * * 2 接收完成 41 * * 3 正在響應 42 * * 4 響應完成 43 * * status - 狀態碼 44 * * 200 OK 45 * * responseText屬性 46 * * 接收服務器端的數據(HTML格式) 47 */ 48 xhr.onreadystatechange = function(){ 49 // 保證服務器端響應的數據發送完畢 50 if(xhr.readyState == 4){ 51 // 保證此次請求必須是成功的 52 if(xhr.status == 200){ 53 // 接收服務器端的數據 54 var data = xhr.responseText; 55 // 測試 56 console.log(data); 57 } 58 } 59 } 60 } 61 62 63 // 定義建立XMLHttpRequest對象的函數 64 function getXhr(){ 65 // 聲明XMLHttpRequest對象 66 var xhr = null; 67 // 根據不一樣瀏覽器建立 68 if(window.XMLHttpRequest){ 69 // 其餘瀏覽器 70 xhr = new XMLHttpRequest(); 71 }else{ 72 // IE瀏覽器(8及以前) 73 xhr = new ActiveXObject("Microsoft.XMLHttp"); 74 } 75 // 返回XMLHttpRequest對象 76 return xhr; 77 }
<?php // 用於處理客戶端的Ajax異步請求 // 1. 接收客戶端發送的請求數據 $user = $_GET['user']; // 2. 向客戶端進行響應 echo $user.' get request succesful.'; ?>
GET 與 POST 的區別:
GET請求類型
* send()方法不起做用,可是不能被省略
xhr.send(null);
* 請求參數 - 添加到URL?key=value
POST請求類型
* send()方法起做用
* 在send()方法被調用前,使用setRequestHeader()方法設置請求頭信息
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
實現Ajax的六步是什麼?(不標準)
1. 建立XMLHttpRequest對象
2. 創建鏈接
3. 發送請求
4. 註冊監聽 - onreadystatechange事件
5. 獲取服務器端的通訊狀態 - readyState
6. 獲取服務器端的狀態碼
XML 解析
XML 語法
聲明:
<?xml version="1.0" encoding="UTF-8" ?>
定義元素:
* 根元素
* 必須是起始標籤
* 只能定義一個
* 定義元素
* 元素名能夠自定義
* 分類
* 起始標籤或單標籤
定義屬性
DOM 解析 XML
建立 XML 解析器:
1 function parseXML(xml){ 2 // 聲明解析XML後的DOM對象 3 var xmlDoc = null; 4 // 根據不一樣的瀏覽器 5 if(window.DOMParser){ 6 // 其餘瀏覽器 7 var parser = new DOMParser(); 8 xmlDoc = parser.parseFromString(xml,"application/xml"); 9 }else{ 10 // IE瀏覽器 11 xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 12 xmlDoc.async = false; 13 xmlDoc.loadXML(xml); 14 } 15 return xmlDoc; 16 }
解析 XML 與解析 HTML 一致
* 不多使用ById和ByName兩個方法
* 注意
* 瀏覽器不容許讀取外部的XML文件
* 瀏覽器解析符合XML格式的字符串
Ajax中的XML格式
* 請求的數據格式 - XML
* 客戶端如何構建符合XML格式的數據
* 構建的數據類型 - 字符串(string)類型
* 字符串的內容符合XML格式的語法要求
* 服務器端如何接收符合XML格式的數據
* 接收客戶端的請求數據 - 字符串(string)類型
* PHP集成了DOM的相關內容
* DOMDocument類
* DOMElement類
* DOMNode類
* 響應的數據格式 - XML
* 服務器端如何構建符合XML格式的數據
* 設置服務器端的響應頭"Content-Type"值爲"text/xml"
* 構建符合XML格式數據內容
* 手動方式構建字符串(string)內容
* DOMDocument對象的方法
* loadXML(符合XML格式的字符串);
* saveXML()方法進行響應
* 客戶端如何接收符合XML格式的數據
* 使用XMLHttpRequest對象的responseXML屬性接收
* 接收回來的就是XML DOM對象(不須要使用XML解析器進行解析)
* 直接使用DOM解析XML DOM對象便可
示例:
1 /* 2 * 建立DOM解析XML的解析器 - 目前 3 * * IE瀏覽器 4 * new ActiveXObject("Microsoft.XMLDOM"); 5 * * 其餘瀏覽器 6 * 建立一個DOM的解析器 7 * var parser = new DOMParser(); 8 * 使用DOM解析器解析XML文件 9 * var xmlDoc = parser.parseFromString(xmlFile,"application/xml"); 10 * 11 * 當前報錯: 12 * * 目前主流瀏覽器 13 * * 不容許讀取本地文件 14 * * 不容許讀取外部文件 15 */ 16 function parseXML(xmlFile){ 17 // 建立解析XML後的DOM對象 18 var xmlDoc = null; 19 // 根據不一樣瀏覽器進行解析 20 if(window.DOMParser){ 21 // 其餘瀏覽器 22 var parser = new DOMParser(); 23 xmlDoc = parser.parseFromString(xmlFile,"application/xml"); 24 }else{ 25 // IE瀏覽器 26 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 27 xmlDoc.async = false; 28 xmlDoc.loadXML(xmlFile); 29 } 30 return xmlDoc; 31 } 32 /* 33 * 測試 34 * 使用DOM的XML解析器 - 解析符合XML格式的字符串 35 * <user> 36 * <name>zhangwuji</name> 37 * </user> 38 */ 39 var xmlDoc = parseXML("<user id='u' name='u'><name>zhangwuji</name></user>"); 40 //console.log(xmlDoc); 41 /* 42 * DOM解析XML與解析HTML沒有任何區別 43 * * 注意 44 * * DOM解析XML使用ById或ByName兩個方式 45 * * 實際開發中只用getElementsByTagName()方法 46 * * 緣由 - 屬性值在XML格式中都是有效數據 47 */ 48 var userEle = xmlDoc.getElementsByName("u")[0]; 49 console.log(userEle);
示例:
1 var btn = document.getElementById("btn"); 2 btn.onclick = function(){ 3 // 實現Ajax的異步交互 4 var xhr = getXhr(); 5 xhr.open("post","07.php"); 6 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 7 /* 8 * 如何構建符合XML格式的請求數據 9 * * 注意 10 * * 請求數據的格式 - key=value 不能改變的 11 * * 將value值構建成符合XML格式的數據 12 * * 數據類型 - 字符串(string) 13 * * 格式符合XML的語法要求 14 * * 編寫注意 15 * * 定義變量 - 專門構建XML格式的數據 16 * * 在send()方法進行拼串 17 */ 18 var user = "<user><name>zhangwuji</name><pwd>123456</pwd></user>"; 19 xhr.send("user="+user); 20 xhr.onreadystatechange = function(){ 21 if(xhr.readyState==4&&xhr.status==200){ 22 // 接收服務器端的響應數據 23 var xmlDoc = xhr.responseXML; 24 var nameEle = xmlDoc.getElementsByTagName("name")[0]; 25 var txtEle = nameEle.childNodes[0]; 26 console.log(txtEle.nodeValue); 27 } 28 } 29 } 30 function getXhr(){ 31 var xhr = null; 32 if(window.XMLHttpRequest){ 33 xhr = new XMLHttpRequest(); 34 }else{ 35 xhr = new ActiveXObject("Microsoft.XMLHttp"); 36 } 37 return xhr; 38 }
1 <?php 2 // 接收客戶端發送的請求數據 3 $user = $_POST['user'];//符合XML格式要求的string類型 4 //var_dump($user); 5 // 建立DOMDocument對象 6 $doc = new DOMDocument(); 7 // 調用loadXML()方法 8 $result = $doc->loadXML($user); 9 //var_dump($doc); 10 11 // 如何構建符合XML格式的數據 12 /* 修改響應頭的Content-Type值爲"text/xml" 13 header('Content-Type:text/xml'); 14 echo $user;// 符合XML格式的string類型 15 */ 16 17 header('Content-Type:application/xml'); 18 echo $doc->saveXML(); 19 ?>
JSON (JavaScript Object Notation) 格式
JSON 數據格式源於 Javascript (JS原生支持)
JSON 的結構
* Array - 數組
* Object - 對象
* 支持的數據類型
* String字符串
* Number數值
* Boolean - true|false
* Object
* Array
* null
Ajax中的JSON格式
* 請求格式爲JSON
* 客戶端向服務器端發送請求爲JSON格式的數據
* 構建符合JSON格式的字符串
* 保證定義字符串時,使用單引號(裏面使用雙引號)
* 服務器端接收JSON格式的數據
* 接收客戶端的數據
* 使用json_decode()函數進行解析
json_decode($json,true)
* 響應格式爲JSON
* 服務器端向客戶端發送響應爲JSON格式的數據
* 使用json_encode()函數將PHP變量(array)轉換成符合JSON格式的字符串
* 客戶端接收JSON格式的數據
* 使用XMLHttpRequest對象的responseText屬性接收
* 沒有responseJSON屬性
* 使用eval()函數進行轉換
示例:
1 var btn = document.getElementById("btn"); 2 btn.onclick = function(){ 3 var xhr = getXhr(); 4 xhr.open("post","10.php"); 5 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 6 /* 7 * 在客戶端如何構建JSON格式 8 * * 構建符合JSON格式的字符串 9 */ 10 var user = '{"name":"zhangwuji","pwd":"123456"}'; 11 xhr.send("user="+user); 12 xhr.onreadystatechange = function(){ 13 if(xhr.readyState==4&&xhr.status==200){ 14 var data = xhr.responseText; 15 /* 16 * 使用eval()函數進行轉換 17 * * 使用"()"將其包裹,eval()函數強制將其轉換爲JSON格式(javascript代碼) 18 * * 不使用"()"將其包裹,eval()函數將其識別爲一個空的代碼塊 19 */ 20 var json = eval("("+data+")"); 21 console.log(json); 22 } 23 } 24 } 25 function getXhr(){ 26 var xhr = null; 27 if(window.XMLHttpRequest){ 28 xhr = new XMLHttpRequest(); 29 }else{ 30 xhr = new ActiveXObject("Microsoft.XMLHttp"); 31 } 32 return xhr; 33 }
1 <?php 2 // 接收客戶端發送的請求數據 3 $user = $_POST['user']; 4 // 就是一個JSON格式的string字符串 5 //var_dump($user); 6 7 $json_user = json_decode($user,true); 8 9 //var_dump($json_user['name']); 10 11 $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; 12 //var_dump(json_decode($json)); 13 14 // 響應數據符合JSON格式的字符串 15 // 1. 手工方式構建 16 //echo '{"name":"zhouzhiruo","pwd":"123456"}'; 17 18 // 2. 使用json_encode()函數 19 echo json_encode($json_user); 20 ?>
HTML(文本格式)、XML格式及JSON格式的優缺點 * HTML格式 * 優勢 - 簡單 * 缺點 - 解析複雜 * XML格式 * 優勢 - 易於構建複雜數據 * 缺點 - 構建、解析複雜 * JSON格式 * 優勢 - 輕量級 * 缺點 - 可能轉換失敗