原生js實現(xiàn)Ajax

如果要用原生的JS實現(xiàn)Ajax怎么整呢,讓我們一起來整一個試試。

方法:

/**

 * 原生js封裝ajax方法

 * @param {Object} conf

 * ajax({

        type:"post",

        url:"test.php",

        data:"name=xx&pwd=xx",

        dataType:"json",

        success:function(data){

            console.log(data);

        }

    });

 */

function _ajax(conf){

    //創(chuàng)建xhr對象

    var createAjax = function() {

        var xhr = null;

        try {

            //IE系列瀏覽器

            xhr = new ActiveXObject("microsoft.xmlhttp");

        } catch (e1) {

            try {

                //非IE瀏覽器

                xhr = new XMLHttpRequest();

            } catch (e2) {

                window.alert("您的瀏覽器不支持ajax,請更換岳链!");

            }

        }

        return xhr;

    };

    // 初始化

    //type參數(shù),可選

    var type = conf.type;

    //url參數(shù),必填 

    var url = conf.url;

    //data參數(shù)可選劲件,只有在post請求時需要

    var data = conf.data;

    //datatype參數(shù)可選    

    var dataType = conf.dataType;

    //回調(diào)函數(shù)可選

    var success = conf.success;

    if (type == null){

        //type參數(shù)可選掸哑,默認(rèn)為get

        type = "get";

    }

    if (dataType == null){

        //dataType參數(shù)可選,默認(rèn)為text

        dataType = "text";

    }

    // 創(chuàng)建ajax引擎對象

    var xhr = createAjax();

    // 打開

    xhr.open(type, url, true);

    // 發(fā)送

    if (type == "GET" || type == "get") {

        xhr.send(null);

    } else if (type == "POST" || type == "post") {

        xhr.setRequestHeader("content-type",

                    "application/x-www-form-urlencoded");

        xhr.send(data);

    }

    xhr.onreadystatechange = function() {

        if (xhr.readyState == 4 && xhr.status == 200) {

            if(dataType == "text"||dataType=="TEXT") {

                if (success != null){

                    //普通文本

                    success(xhr.responseText);

                }

            }else if(dataType=="xml"||dataType=="XML") {

                if (success != null){

                    //接收xml文檔    

                    success(xhr.responseXML);

                }  

            }else if(dataType=="json"||dataType=="JSON") {

                if (success != null){

                    //將json字符串轉(zhuǎn)換為js對象  

                    success(eval("("+xhr.responseText+")"));

                }

            }

        }

    };

}

詳細(xì)說明:

1.Ajax步驟:1.創(chuàng)建零远,2.打開連接苗分,發(fā)送數(shù)據(jù),3.接收數(shù)據(jù)

1.1關(guān)于創(chuàng)建

除了ie低版本牵辣,其它都支持XMLHttpRequest對象

1.2關(guān)于連接:

open(method,url,async)主要有三個參數(shù)摔癣,關(guān)于post和get方法需要注意,get方法參數(shù)是放URL上進行傳輸纬向,post是單獨作為send的參數(shù)傳輸?shù)胶笈_的择浊,因此,如果用post方法我們必須設(shè)置請求頭傳的數(shù)據(jù)類型setRequestHeader('content-type',value),value可以是application/x-www-form-urlencoded,multipart/form-data等逾条。

1.3關(guān)于接收數(shù)據(jù):

當(dāng)readyState變化時會調(diào)用onreadystatechange

readyState主要有五種狀態(tài):

| 值 | 狀態(tài) | 描述 |
| 0 | UNSENT (未打開) | open()方法還未被調(diào)用. |
| 1 | OPENED (未發(fā)送) |

open()方法已經(jīng)被調(diào)用.

|
| 2 | HEADERS_RECEIVED (已獲取響應(yīng)頭) | send()方法已經(jīng)被調(diào)用, 響應(yīng)頭和響應(yīng)狀態(tài)已經(jīng)返回. |
| 3 | LOADING (正在下載響應(yīng)體) | 響應(yīng)體下載中; responseText中已經(jīng)獲取了部分?jǐn)?shù)據(jù). |
| 4 | DONE (請求完成) | 整個請求過程已經(jīng)完畢. |

response

響應(yīng)實體的類型由 responseType 來指定琢岩, 可以是 ArrayBufferBlob师脂, Document担孔, JavaScript 對象 (即 "json"), 或者是字符串吃警。如果請求未完成或失敗糕篇,則該值為 null。

responseType

設(shè)置該值能夠改變響應(yīng)類型酌心。就是告訴服務(wù)器你期望的響應(yīng)格式拌消。

| Value | Data type of response property |
| "" (空字符串) | 字符串(默認(rèn)值) |
| "arraybuffer" | ArrayBuffer |
| "blob" | Blob |
| "document" | Document |
| "json" | JavaScript 對象,解析自服務(wù)器傳遞回來的JSON 字符串安券。 |
| "text" | 字符串 |

responseText

此次請求的響應(yīng)為文本墩崩,或是當(dāng)請求未成功或還未發(fā)送時為 null。只讀完疫。

responseXML

本次請求的響應(yīng)是一個 Document 對象泰鸡,如果是以下情況則值為 null:請求未成功,請求未發(fā)送壳鹤,或響應(yīng)無法被解析成 XML 或 HTML盛龄。當(dāng)響應(yīng)為text/xml 流時會被解析。當(dāng) responseType 設(shè)置為"document"芳誓,并且請求為異步的余舶,則響應(yīng)會被當(dāng)做 text/html 流來解析。只讀.

status

該請求的響應(yīng)狀態(tài)碼 (例如, 狀態(tài)碼200 表示一個成功的請求).只讀.

1開頭的是information responses

2開頭是響應(yīng)成功

3重定向信息

4客戶端錯誤信息

5服務(wù)器端響應(yīng)錯誤

statusText

該請求的響應(yīng)狀態(tài)信息,包含一個狀態(tài)碼和原因短語 (例如 "200 OK"). 只讀.

upload

可以在 upload 上添加一個事件監(jiān)聽來跟蹤上傳過程锹淌。

不考慮瀏覽器兼容性匿值,當(dāng)時在一個項目中,我發(fā)現(xiàn)在谷歌瀏覽器下赂摆,上傳文件的時候挟憔,在谷歌瀏覽器的狀態(tài)欄可以看到上傳進度钟些,我想谷歌應(yīng)該有提供方法出來供開發(fā)調(diào)用,開啟調(diào)試發(fā)現(xiàn)確實有绊谭。

代碼如下:

進度條當(dāng)時是easyui的政恍。

xhr.onloadstart = $.message.progress({text:'{value}%',title:'文件上傳',interval:false});

xhr.upload.onprogress = function(evt){

if(evt.lengthComputable){

var comVal = Math.round(evt.loaded * 100 / evt.total);

$("div.messager-p-bar").progressbar("setValue", comVal);

}

}

補充:

post和get主要差別

  1. 發(fā)送數(shù)據(jù)的方式:get是放URL上,post是單獨作為請求體

  2. 安全性达传,post比get相對安全篙耗,因為get在URL上可見的

  3. 大小,get有限制宪赶,一般幾kb宗弯,post受服務(wù)器端限制,一般可以幾十兆

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搂妻,一起剝皮案震驚了整個濱河市蒙保,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叽讳,老刑警劉巖追他,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岛蚤,居然都是意外死亡邑狸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門涤妒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來单雾,“玉大人,你說我怎么就攤上這事她紫」瓒眩” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵贿讹,是天一觀的道長渐逃。 經(jīng)常有香客問我,道長民褂,這世上最難降的妖魔是什么茄菊? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮赊堪,結(jié)果婚禮上面殖,老公的妹妹穿的比我還像新娘。我一直安慰自己哭廉,他們只是感情好脊僚,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遵绰,像睡著了一般辽幌。 火紅的嫁衣襯著肌膚如雪增淹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天舶衬,我揣著相機與錄音埠通,去河邊找鬼赎离。 笑死逛犹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梁剔。 我是一名探鬼主播虽画,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荣病!你這毒婦竟也來了码撰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤个盆,失蹤者是張志新(化名)和其女友劉穎脖岛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颊亮,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡柴梆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了终惑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绍在。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雹有,靈堂內(nèi)的尸體忽然破棺而出偿渡,到底是詐尸還是另有隱情,我是刑警寧澤霸奕,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布溜宽,位于F島的核電站,受9級特大地震影響质帅,放射性物質(zhì)發(fā)生泄漏适揉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一临梗、第九天 我趴在偏房一處隱蔽的房頂上張望涡扼。 院中可真熱鬧,春花似錦盟庞、人聲如沸吃沪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽票彪。三九已至红淡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間降铸,已是汗流浹背在旱。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留推掸,地道東北人桶蝎。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像谅畅,于是被迫代替她去往敵國和親登渣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容