ajax

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

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

        xhr.send();
        // 發(fā)送方式為post時數(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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