ajax:一種要求資料的方式,不需要刷新整個頁面;
ajax的技術核心是 XMLHttpRequest 物件;
ajax 請求流程:建立 XMLHttpRequest 物件、連接伺服器、傳送請求、接收回應資料;
/** * 得到ajax对象 */ function getajaxHttp() { var xmlHttp; try { //chrome, Firefox, Opera 8.0+, Safari xmlHttp = new XMLHttpRequest(); } catch (e) { // Internet Explorer try { //IE5,6 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { //IE7以上 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { alert("您的浏览器不支持AJAX!"); return false; } } } return xmlHttp; } /** * 发送ajax请求 * url--url * methodtype(post/get) * con (true(异步)|false(同步)) * parameter(参数) * functionName(回调方法名,不需要引号,这里只有成功的时候才调用) * (注意:这方法有二个参数,一个就是xmlhttp,一个就是要处理的对象) * obj需要到回调方法中处理的对象 */ function ajaxrequest(url,methodtype,con,parameter,functionName,obj){ var xmlhttp=getajaxHttp(); xmlhttp.onreadystatechange=function(){ // readyState值说明 // 0,初始化,XHR对象已经创建,还未执行open // 1,载入,已经调用open方法,但是还没发送请求 // 2,载入完成,请求已经发送完成 // 3,交互,可以接收到部分数据 // status值说明 // 200:成功 // 404:没有发现文件、查询或URl // 500:服务器产生内部错误 if(xmlhttp.readyState==4&& XHR.status == 200){ //HTTP响应已经完全接收才调用 functionName(xmlhttp,obj); } }; xmlhttp.open(methodtype,url,con); xmlhttp.send(parameter); } //这就是参数 function createxml(){ var xml="<user><userid>asdfasdfasdf<\/userid><\/user>";//"\/"这不是大写V而是转义是左斜杠和右斜杠 return xml; } //这就是参数 function createjson(){ var json={id:0,username:"好人"}; return json; } function c(){ alert(""); }
//測試
ajaxrequest("http://www.baidu.com","post",true,createxml(),c,document);
我們再來看一個範例
ajax({ url: "./TestXHR.aspx", //请求地址 type: "POST", //请求方式 data: { name: "super", age: 20 }, //请求参数 dataType: "json", success: function (response, xml) { // 此处放成功后执行的代码 }, fail: function (status) { // 此处放失败后执行的代码 } }); function ajax(options) { options = options || {}; options.type = (options.type || "GET").toUpperCase(); options.dataType = options.dataType || "json"; var params = formatParams(options.data); //创建 - 非IE6 - 第一步 if (window.XMLHttpRequest) { var xhr = new XMLHttpRequest(); } else { //IE6及其以下版本浏览器 var xhr = new ActiveXObject('Microsoft.XMLHTTP'); } //接收 - 第三步 xhr.onreadystatechange = function () { if (xhr.readyState == 4) { var status = xhr.status; if (status >= 200 && status < 300) { options.success && options.success(xhr.responseText, xhr.responseXML); } else { options.fail && options.fail(status); } } } //连接 和 发送 - 第二步 if (options.type == "GET") { xhr.open("GET", options.url + "?" + params, true); xhr.send(null); } else if (options.type == "POST") { xhr.open("POST", options.url, true); //设置表单提交时的内容类型 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(params); } } //格式化参数 function formatParams(data) { var arr = []; for (var name in data) { arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name])); } arr.push(("v=" + Math.random()).replace(".","")); return arr.join("&"); }
我們來看看原理
1、建立
1.1、IE7及其上述版本中支援原生的 XHR 對象,因此可以直接使用: var oAjax = new XMLHttpRequest();
1.2、IE6及其先前的版本中,XHR物件是透過MSXML庫中的一個ActiveX物件實現的。有的書中細化了IE中此類物件的三種不同版本,即MSXML2.XMLHttp.6.0;個人感覺太麻煩,可以直接使用下面的語句創建: var oAjax =new ActiveXObject('Microsoft.XMLHTTP');
2、連線與傳送
2.1、open()函數的三個參數:請求方式、請求位址、是否非同步請求(同步請求的情況極少,至今還沒有用到過);
2.2、GET 請求方式是透過URL參數將資料提交到伺服器的,POST則是透過將資料作為 send 的參數提交到伺服器;
2.3、POST 請求中,在傳送資料之前,要設定表單提交的內容類型;
2.4、提交到伺服器的參數必須經過 encodeURIComponent() 方法進行編碼,實際上在參數清單」key=value」的形式中,key 和 value 都需要編碼,因為會包含特殊字元。每次請求的時候都會在參數清單中拼入一個 “v=xx” 的字串,這樣是為了拒絕緩存,每次都直接請求到伺服器上。
encodeURI() :用於整個 URI 的編碼,不會對本身屬於 URI 的特殊字元進行編碼,如冒號、正斜線、問號和井號;其對應的解碼函數 decodeURI();
encodeURIComponent() :用於對 URI 中的某一部分進行編碼,會對它發現的任何非標準字元進行編碼;其對應的解碼函數 decodeURIComponent();
3、接收
3.1、接收到回應後,回應的資料會自動填入XHR對象,相關屬性如下
responseText:回應傳回的主體內容,為字串類型;
responseXML:如果回應的內容類型是 "text/xml" 或 "application/xml",這個屬性中將保存相應的xml 數據,是 XML 對應的 document 類型;
status:回應的HTTP狀態碼;
statusText:HTTP狀態的說明;
3.2、XHR物件的readyState屬性表示請求/回應過程的目前活動階段,這個屬性的值如下
0-未初始化,尚未呼叫open()方法;
1-啟動,呼叫了open()方法,未呼叫send()方法;
2-發送,已經呼叫了send()方法,未接收到回應;
3-接收,已接收到部分回應資料;
4-完成,已經接收到全部回應資料;
只要readyState 的值變化,就會呼叫readystatechange 事件,(其實為了邏輯上通順,可以把readystatechange放到send之後,因為send時請求伺服器,會進行網路通信,需要時間,在send之後指定readystatechange事件處理程序也是可以的,我通常都是這樣用,但為了規範和跨瀏覽器相容性,還是在open之前進行指定吧)。
3.3、在readystatechange事件中,先判斷回應是否接收完成,然後判斷伺服器是否成功處理請求,xhr.status 是狀態碼,狀態碼以2開頭的都是成功,304表示從快取中獲取,上面的程式碼在每次請求的時候都加入了隨機數,所以不會從快取中取值,故該狀態不需判斷。
4、ajax請求是不能跨域的!