今天幫朋友寫了一個簡單的ajax的demo,發現了一些東西,決定寫一篇文章記錄一下,避免之後挖坑。javascript
function createXHR(){ if(XMLHttpRequest){ return new XMLHttpRequest(); }else{ return new ActiveXObject('Microsoft.XMLHTTP') } }
這一段js代碼來源自w3school,用於建立兼容各瀏覽器的XMLHttpRequest對象的含義:php
檢測客戶端是否有XMLHttpRequest,不然使用ActiveXObject
關於XMLHttpRequest對象,IE5是第一個引入XHR對象的瀏覽器,在IE5中,XHR是經過activeX對象實現的.所以在IE中可能遇到三種不一樣版本的XHR對象,MXSML2.XMLHTTP,MXSML2.XMLHttp.3.0和MXSML2.XMLHttp.6.0。html
爲了向咱們偉大的IE瀏覽器「致敬」,咱們必須添加額外的代碼進行建立
如下代碼適用與IE7如下的狀況:java
function createXHR(){ if(typeof argument.callee.activeXString != 'string'){ var versions = ['MXSML2.XMLHTTP','MXSML2.XMLHttp.3.0','MXSML2.XMLHttp.6.0']; var i len; for(i = 0;len=versions.length;i<len;i++){ try{ new ActiveXObject(varsions[i]); argument.callee.activeXString = varsions[i]; }catch{ <!-- 跳過 --> } } } return new ActiveXObject(argument.callee.activeXString); }
但每每我不會考慮這麼多,能看懂前面的函數也是很不容易了,再讓我寫出來,個人天!當你們和我這麼懶的時候,能夠直接使用第一份代碼,也就是w3school那一套代碼,咱們使用原生的XHR對象進行建立。
固然,咱們這裏也給出完整的代碼。ajax
function createXHR(){ if(typeof XMLHttpRequest != 'undefined'){ return new XMLHttpRequest(); }else if(typeof argument.callee.activeXString != 'string'){ var versions = ['MXSML2.XMLHTTP','MXSML2.XMLHttp.3.0','MXSML2.XMLHttp.6.0']; var i len; for(i = 0;len=versions.length;i<len;i++){ try{ new ActiveXObject(varsions[i]); argument.callee.activeXString = varsions[i]; }catch{ <!-- 跳過 --> } } return new ActiveXObject(argument.callee.activeXString); }else{ throw new Error("沒有XHR對象存在"); } }
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>demo</title> </head> <body> <form> <button onclick="returnText();return false">登錄</button> </form> <script type="text/javascript"> function returnText(){ var xhr = createXHR(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){ alert(xhr.responseText); }else{ alert('獲取失敗'+xhr.status) } } } xhr.open('get','demo.php',true); xhr.send(null); } function createXHR(){ if(typeof XMLHttpRequest != 'undefined'){ return new XMLHttpRequest(); }else{ return new ActiveXObject('Microsoft.XMLHTTP') } } </script> </body> </html>
建立好XHR對象只是第一步,纔是咱們各類操做的開始。瀏覽器
open()函數會啓動一個請求,但並非發送,能夠看做辦事以前的準備。
它接受三個函數:異步
open(get/post,url,false/true)
請求類型:最經常使用的就是get和post函數
路徑:就是要請求的操做的文件的urlpost
是否異步url
咱們這是使用的是get方式,由於咱們並無要發送的數據。
異步咱們選擇了true,無心中發如今使用false時候,火狐出現了警告:
主線程中同步的 XMLHttpRequest 已不推薦使用,因其對終端用戶的用戶體驗存在負面影響。
具體須要再瞭解。
天然而然,準備好了就要發送,send()只接受一個參數,那就是要發送的數據。咱們使用的是get,沒有數據,那就null好了。
由於這篇文章主要是講ajax,因此php部分我只用了最簡單的echo
<?php echo '成功了'; ?>
這樣就能在接受到請求後返回一個字符串。
咱們怎麼樣才能直到php文件將數據處理完,返回給客戶端了呢?
這時候咱們就須要監測XHR的readyState屬性。先介紹如下readyState屬性:
0:初始化未完成,未調用open()
1: 啓動調永了open()函數,可是尚未send
2:發送,調永了send()函數,尚未接收到響應
3:開始接收,接收到部分的數據
4:完成,接收到了所有數據。
因此在上面的函數中咱們能夠看到,咱們去監測readyState屬性,等到等於4的時候,也就是數據接收完成以後,咱們開始對數據進行處理。
這是一個手動建立XHR對象並使用最簡單的方法。之後回繼續進行更新。介紹其更詳細的用法。