ajax

ajax 是前后端實(shí)現(xiàn)交互的方案,利用瀏覽器的XMLHttpRequest對(duì)象,發(fā)送http請(qǐng)求,和接受http響應(yīng),ajax與后端的交互式異步的,可以在瀏覽器不刷新頁面時(shí)實(shí)現(xiàn)頁面的局部更新,但請(qǐng)求不會(huì)記錄在瀏覽器的歷史記錄中,也就是無法前進(jìn)后退

  • ajax中的事件與觸發(fā)條件
onreadystatechange  每當(dāng)xhr.readyState改變時(shí)觸發(fā);但xhr.readyState由非0值變?yōu)?時(shí)不觸發(fā)。
onloadstart 調(diào)用xhr.send()方法后立即觸發(fā),若xhr.send()未被調(diào)用則不會(huì)觸發(fā)此事件。
onprogress  xhr.upload.onprogress在上傳階段(即xhr.send()之后,xhr.readystate=2之前)觸發(fā),每50ms觸發(fā)一次;xhr.onprogress在下載階段(即xhr.readystate=3時(shí))觸發(fā),每50ms觸發(fā)一次。
onload  當(dāng)請(qǐng)求成功完成時(shí)觸發(fā),此時(shí)xhr.readystate=4
onloadend   當(dāng)請(qǐng)求結(jié)束(包括請(qǐng)求成功和請(qǐng)求失?。r(shí)觸發(fā)
onabort 當(dāng)調(diào)用xhr.abort()后觸發(fā)
ontimeout   xhr.timeout不等于0,由請(qǐng)求開始即onloadstart開始算起,當(dāng)?shù)竭_(dá)xhr.timeout所設(shè)置時(shí)間請(qǐng)求還未結(jié)束即onloadend,則觸發(fā)此事件。
onerror 在請(qǐng)求過程中,若發(fā)生Network error則會(huì)觸發(fā)此事件(若發(fā)生Network error時(shí),上傳還沒有結(jié)束,則會(huì)先觸發(fā)xhr.upload.onerror,再觸發(fā)xhr.onerror;若發(fā)生Network error時(shí),上傳已經(jīng)結(jié)束,則只會(huì)觸發(fā)xhr.onerror)。注意,只有發(fā)生了網(wǎng)絡(luò)層級(jí)別的異常才會(huì)觸發(fā)此事件,對(duì)于應(yīng)用層級(jí)別的異常,如響應(yīng)返回的xhr.statusCode是4xx時(shí),并不屬于Network error,所以不會(huì)觸發(fā)onerror事件,而是會(huì)觸發(fā)onload事件。
  • ajax示例
<script type="text/javascript">
        var xhr = window.XMLHttpRequest? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); //兼容ie的ajax對(duì)象
        xhr.timeout = 1000;//設(shè)置請(qǐng)求超時(shí)時(shí)間
        xhr.open('get',url,false);//布爾表示是否異步發(fā)送請(qǐng)求
        // get方式發(fā)送請(qǐng)求需要發(fā)送的數(shù)據(jù)拼接在url中 url= "url"+'?'+"key=value"  
        xhr.onreadystatechange = function(){
            // xhr.onreadystatechange 可替換成 xhr.onload
            if(xhr.readystate === 4){
                if(xhr.status==200 & xhr.status <300||xhr.status ==304){
                    console.log(xhr.responseText)
                };
            }else{
                console.log(erro)
            };
        };
        xhr.ontimeout = function(){
            //超時(shí)處理函數(shù)
        }
         xhr.upload.onprogress = function(e) {
            //如果是上傳文件,可以獲取上傳進(jìn)度
        }

        xhr.send();
        // 發(fā)送方式為post時(shí)數(shù)據(jù)需要在 send(data)中發(fā)送send("key=value")
        // 可用 FormData 實(shí)現(xiàn)表單數(shù)據(jù)序列化 xhr.send(new FormData(form))
    </script>
  • ajax封裝
<script type="text/javascript">

        function ajax(option){
            
            var type = option.type||'get',
            url = option.url||'url',
            datatype = option.datatype||'json',
            data = option.data||{},
            onsuccess = option.onsuccess||function(){},
            onerror = option.onerror||function(){};

            var newArry=[];
            for(var key in data){
                    newArry.push(key+"="+data[key])
                };
            var dataStr = newArry.join('$');
            if(type==='get'){
                url = url +'?'+dataStr
            }

            // var xhr = window.XMLHttpRequest? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); 
            var xhr = new XMLHttpRequest();
            xhr.timeout = 1000;
            xhr.open(type,url,true);
        
            xhr.onreadystatechange = function(){
                
                if(xhr.readyState === 4){
                    if(xhr.status>=200 && xhr.status <300||xhr.status ==304){
                        
                        if(datatype=='json'){
                            
                            data= JSON.parse(xhr.responseText);
                        }else{
                            data = xhr.responseText;
                        };
                        option.onsuccess(data);
                    }else{
                        option.onerror()
                    };
                };
            };
            xhr.ontimeout = function(){
                
            };
             xhr.upload.onprogress = function(e) {
                
            };

            if(type==='get'){
                xhr.send(null);
            }else if(type =='post'){
                xhr.send(dataStr)
            };
        };
        // 調(diào)用
        ajax({
            type:'get',
            url:'http://api.jirengu.com/weather.php',
            datatype:'json',
            data: {
                city:'北京'
            },
            onsuccess:function(data){
                console.log(data);
            },
            onerror:function(){
                console.log('error')
            }
        })
    </script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容