成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

【W(wǎng)eb全棧課程5】自己封裝一個(gè)簡(jiǎn)單的ajax

olle / 1074人閱讀

摘要:內(nèi)部怎么實(shí)現(xiàn)的使用一個(gè)文件來(lái)模擬服務(wù)器返回,代碼如下請(qǐng)求的發(fā)送實(shí)際上我們都通過(guò)瀏覽器的實(shí)現(xiàn),使用,不考慮的兼容,我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的請(qǐng)求如下。

ajax ajax內(nèi)部怎么實(shí)現(xiàn)的?

使用一個(gè)php文件來(lái)模擬服務(wù)器返回,php代碼如下

請(qǐng)求的發(fā)送實(shí)際上我們都通過(guò)瀏覽器的XMLHttpRequest實(shí)現(xiàn),ie6使用ActiveXObject,不考慮IE6的兼容,我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的xhr請(qǐng)求如下。


    
    
    
    
        
    
xhr.readyState狀態(tài)值
0:剛剛創(chuàng)建初始狀態(tài)
1:已連接
2:已發(fā)送
3:已接受-頭(32k上限)
4:已接受-body(1G上限)
http狀態(tài)碼
1XX 消息
2XX 成功
3XX 重定向
    301 永久重定向——瀏覽器永遠(yuǎn)不會(huì)再次請(qǐng)求老的地址
    302 臨時(shí)重定向——瀏覽器下次還會(huì)請(qǐng)求老地址
    304 (not modified)重定向到緩存請(qǐng)求——因此304也是成功
4XX 請(qǐng)求錯(cuò)誤,客戶(hù)端錯(cuò)誤
5XX 服務(wù)端錯(cuò)誤
6XX 擴(kuò)展錯(cuò)誤碼

因此可以通過(guò)2XX和304的狀態(tài)碼判斷請(qǐng)求成功。

    // 接收;4代表結(jié)束
    xhr.onreadystatechange = function(){
        if (xhr.readyState ==4){
            if ((xhr.status>=200&&xhr.status<300)||xhr.status==304){
                alert("成功:"+xhr.responseText);
                console.log(xhr);
            } else {
                alert("失敗");
            }
        }
    };
xhr返回值

xhr.responseText 文本數(shù)據(jù)
xhr.responseXML XML數(shù)據(jù)(已經(jīng)不常用)

xml數(shù)據(jù)是不固定標(biāo)簽組成的數(shù)據(jù),xml數(shù)據(jù)更加占空間,例如:


    xiaoyezi
    18
    front engineer

json格式:

let json={name:"xiaoyezi",age:18,job:"front engineer"};
XMLHttpRequest發(fā)送POST請(qǐng)求

按照我們上面代碼的思路,post請(qǐng)求的寫(xiě)法推導(dǎo)出來(lái)應(yīng)該是如下寫(xiě)法,實(shí)際上如下寫(xiě)法并不行。

// 連接,true代表異步,false代表同步;瀏覽器對(duì)異步的xhr會(huì)報(bào)錯(cuò)
xhr.open("post","../server/a.php",true,);

// 發(fā)送;send里面是body,post需要發(fā)送
xhr.send("a=12&b=5");

對(duì)比f(wàn)orm的post提交方式,我們可以看到,Request Headers里面有條設(shè)置和form提交的不同:

Content-Type: text/plain;charset=UTF-8
form提交:Content-Type: application/x-www-form-urlencoded

需要增加setRequestHeader的設(shè)置,再send請(qǐng)求的body內(nèi)容,請(qǐng)求成功。

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("a=12&b=5");
content-type類(lèi)型及含義?
text/plain 文本
application/x-www-form-urlencoded &&&連接的方式,eg:a=12&b=5
multippart/form-data 定界符分割各個(gè)數(shù)據(jù)(文件上傳)
實(shí)現(xiàn)簡(jiǎn)單的自定義ajax
function ajax(options){
    // 數(shù)據(jù)處理
    options = options || {};
    options.data = options.data || {};
    options.type = options.type || "get";
    options.dataType = options.dataType || "text"; //解析數(shù)據(jù)

    let arr = [];
    for (let name in options.data) {
        arr.push(`${name}=${encodeURIComponent(options.data[name])}`);
    }
    let dataStr = arr.join("&");

    // 不兼容ie6
    let xhr=new XMLHttpRequest();

    // 連接,true代表異步,false代表同步;瀏覽器對(duì)異步的xhr會(huì)報(bào)錯(cuò)
    if (options.type == "get"){
        xhr.open("get",options.url + "?" + dataStr,true);
        xhr.send();
    } else {
        xhr.open("post",options.url,true,);

        // 發(fā)送;send里面是body,post需要發(fā)送Content-Type
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xhr.send(dataStr);
    }

    // 接收;4代表結(jié)束
    xhr.onreadystatechange = function(){
        if (xhr.readyState ==4){
            if ((xhr.status>=200&&xhr.status<300)||xhr.status==304){
                let result = xhr.responseText;
                switch (options.dataType){
                    case "text":
                        break;
                    case "json":
                        if (window.JSON && JSON.parse){
                            result = JSON.parse(result);
                        } else {
                            result = eval("("+result+")");
                        }
                        break;
                    case "xml":
                        result = xhr.XMLHttpRequest;
                        break;
                    default:
                        break;

                }
                options.success && options.success(result);
            } else {
                options.error && options.error("error");
            }
        }
    };
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95610.html

相關(guān)文章

  • Web全棧課程三】ES6特性介紹(下)

    摘要:示例運(yùn)行函數(shù)彈出彈出函數(shù)接收參數(shù),返回值。其中,返回一個(gè)對(duì)象,是的返回值,代表函數(shù)是否執(zhí)行完成。 ES6特性介紹(下) ES6新的標(biāo)準(zhǔn),新的語(yǔ)法特征:1、變量/賦值2、函數(shù)3、數(shù)組/json4、字符串5、面向?qū)ο?、Promise7、generator8、ES7:async/await 《【W(wǎng)eb全棧課程二】ES6特性介紹(上)》見(jiàn):https://segmentfault.com/a...

    wangshijun 評(píng)論0 收藏0
  • 全棧之路】JAVA基礎(chǔ)課程七_(dá)AJAX原理剖析(20190617v1.0)

    摘要:借鑒圖片僅用于學(xué)習(xí)分享,請(qǐng)尊重原創(chuàng)作者,勿用于商用。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請(qǐng)求數(shù)據(jù)?;静襟E創(chuàng)建對(duì)象也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象。創(chuàng)建一個(gè)新的請(qǐng)求并指定該請(qǐng)求的方法及驗(yàn)證信息。設(shè)置響應(yīng)請(qǐng)求狀態(tài)變化的函數(shù)。使用和實(shí)現(xiàn)局部刷新。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解...

    biaoxiaoduan 評(píng)論0 收藏0
  • 全棧之路】JAVA基礎(chǔ)課程七_(dá)AJAX原理剖析(20190617v1.0)

    摘要:借鑒圖片僅用于學(xué)習(xí)分享,請(qǐng)尊重原創(chuàng)作者,勿用于商用。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請(qǐng)求數(shù)據(jù)?;静襟E創(chuàng)建對(duì)象也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象。創(chuàng)建一個(gè)新的請(qǐng)求并指定該請(qǐng)求的方法及驗(yàn)證信息。設(shè)置響應(yīng)請(qǐng)求狀態(tài)變化的函數(shù)。使用和實(shí)現(xiàn)局部刷新。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解...

    yintaolaowanzi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<