/*
* Ajax的核心操作對象是xmlHttpRequest
* 簡化操作步驟:實例化一個xmlHttpRequest對象 ==> 發送請求 ==> 接受響應 ==> 執行回調
*/
實例化對象
考慮到兼容問題,非IE5/IE6 使用 => new XMLHttpRequest();
IE5/IE6使用 => new ActiveXObject(Microsoft.XMLHTTP); ☯神吶,請帶走IE吧!
發送請求
使用 XMLHttpRequest 對象的 open('GET',url,async) 和 send() 方法:
❶ open() 有三個參數:
分別為http請求方式(get/post) ==》與 POST 相比,GET 更簡單也更快,POST 沒有數據量限制,不會緩存,相對安全
http請求地址 ==》url(統一資源定位符)文件所在服務器的地址
async:true(異步)或 false(同步)
❷send(string) string:僅用於 POST 請求
接受響應,執行回調
當readyState的值發生改變時,觸發readystatechange事件,事件中就可以為所欲為了
readyState==4 =>請求加載完成 / http的狀態為200 =>響應成功
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>異步操作集合啦</title> <script type="text/javascript"> /* * Ajax的核心操作對象是xmlHttpRequest * 簡化操作步驟:實例化一個xmlHttpRequest對象 ==> 發送請求 ==> 接受響應 ==> 執行回調 */ var jsAjax = function() { var xmlHttpR = null; if(window.ActiveXObject) { //IE5/IE6把xmlHttpRequest封裝在window的子對象ActiveXObject中 xmlHttpR = new ActiveXObject(Microsoft.XMLHTTP); } else if(window.XMLHttpRequest) { //非IE5、IE6 xmlHttpR = new XMLHttpRequest(); } if(xmlHttpR) { xmlHttpR.open("GET", "ajax.xml", true); xmlHttpR.onreadystatechange = function(e) { if(xmlHttpR.readyState == 4) { if(xmlHttpR.status == 200) { console.log(xmlHttpR.responseText); } } } xmlHttpR.send(null); } } </script> </head> <body> </body> </html>
<?xml version="1.0" encoding="utf-8"?> <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
/*
* js就是這么復雜,一套行雲流水的操作下來,瀏覽器F5,哎,咋沒效果,不行,修改代碼,再刷,還有bug等着你! (∪。∪)。。。zzz 敲兩行jQuery放松一下!
* jQuery操作ajax用一個封裝的函數 $.ajax() 就可以搞定,操作步驟及其簡化!!!
*/
常用參數
type:"get", //http請求方式,值為 get/post 默認值為get
url:"", //統一資源定位符 !!!重要參數
async:true, //值為 true/false 默認值為true,為異步,ajax發送請求后,在等待server端返回的這個過程中,會繼續執行ajax塊后面的腳本(異步思想),直到server端返回正確的結果才會去執行success
dataType:"xml", //返回數據的類型 ,值為 xml/html/script/json/jsonp/text
data:obj, //傳給sever的數據 可以是字符串也可以是對象(比如登陸時傳用戶名密碼)
cache:true, //默認為true(當dataType為script時,默認為false),設置為false將不會從瀏覽器緩存中加載請求信息
complete:function(){}, //請求完成后調用的回調函數(請求成功或失敗時均調用)
success:function(res){}, //成功時調用回調函數 !!!重要回調
error: function (err) {} //發生錯誤時調用回調函數
jquery封裝了 "jquery.ajax()" "jquery.post()" "jquery.get() " "jquery(selector).load()" "jquery.getJson()" "jquery.getScript()"
其實弄懂$.ajax()就好了,別的都是它延伸出來,具有某種特異功能,$.ajax是大一統,霸天下,廢話不多說,直接上實例,看注釋
$(".loadDom").load("ajax.html", function(responseText, textStatus, xmlHttpRequest) { /* * 常用與把某段文本(如 :html文檔) 嵌入當前文檔中,更逆天的是可以把某文檔的某片段加載進來 如$(".loadDom").load("load.htm div.test"). * load() 有四個參數: * ① url:可以加入querystring ==》'login.php?uname="wbx_2018@qq.com"&pwd="jiubugaosuni"',很明顯這已然是get請求 * ② data:附帶參數就會轉換為post請求,基本會省略 * ③ function:回調函數 ↙☜下左繼續分析 * * 回調函數也可以攜帶三個參數: * ① responseText 服務端返回的文本 * ② textStatus 值為success或error * ③ xmlHttpRequest 這對象就不多說了,原生的 */ console.log(responseText); }) $.get("ajax.json", { para1: "val1", para2: "val2" }, function(data, textStatus) { console.log(data); }, "json") //$.post("ajax.php",{ // para1: "val1", // para2: "val2" //}, function(data, textStatus) { // console.log(data); //},"json") $.getScript('ajax.js', function(data) { console.log(data); }); $.getJSON('ajax.json', function(data) { console.log(data); });
$.ajax({ type: "get", async: true, url: "ajax.xml", dataType: "xml", complete: function(data) { console.log(data); }, success: function(res) { //遍歷xml文檔 dom操作 var books=$(res).find("bookstore book"), $this, $htm=[]; $.each(books, function(index) { $this=$(this); $htm.push("第"+(index+1)+"本書: 《"+$this.find("title").text()+"》 --- "); $htm.push($this.find("author").text()); $htm.push(" ("+$this.find("year").text()+")<br>"); }); $("#test").append($htm.join("")); } });
注:在進行ajax訪問時也許會遇到頁面無效果或是報錯---XMLHttpRequest cannot load,出現這種情況一般是瀏覽器禁止ajax本地訪問(chrome)。把文件部署到服務器不會出現該問題。解決方法:
1.可在 Chrome 快捷方式中添加啟動參數: --allow-file-access-from-files(前面加空格)
2.用HBuilder這類具有內置服務器的編輯器,直接運行即可
當然我們可以用瀏覽器提供的調試工具,搞清楚 阿賈克斯 的一舉一動,還是