ajax基礎

關於ajax的一些總結(面試可能會使用的到)
    參考:
        http://www.ruanyifeng.com/blog/2016/04/cors.html
        https://segmentfault.com/a/1190000012469713
        http://mp.weixin.qq.com/s/H2znDNNIVWC5o5i0bp1rhg
        http://mp.weixin.qq.com/s/AcVV08QmiK80aALk7wu5uQ
    0.ajax的優缺點:
        優點:
            頁面無刷新
            響應速度快
            減少帶寬
            基於標準化,並被廣泛的支持
        缺點:
            無法後退
            印象程序的異常處理機制
            安全問題
            對搜索引擎的支持比較弱
    1.最原始的ajax的寫法:
        1.什麼是ajax
            頁面不跳轉,就可以更新頁面的部分內容
        2.ajax的原生寫法:
            就是XMLHttpRequest對象的使用(這個是Ajax技術的核心)
        3.ajax的請求流程:
            1.創建XMLHttpRequest對象
            2.打開請求地址,初始化請求對象
            3.發送請求數據
            4.監聽回調函數的狀態
            5.收到服務器,返回的應答結果
        4.ajax的具體寫法:
            代碼:
                var xmlhttp;
                function loadXMLDoc(url)
                {
                    xmlhttp=null;
                    if (window.XMLHttpRequest)   //兼容和其他的瀏覽器
                    {// code for all new browsers
                        xmlhttp=new XMLHttpRequest();//在這裏創建 XMLHttpRequest對象
                    }
                    else if (window.ActiveXObject) //兼容IE瀏覽器
                      {// code for IE5 and IE6
                        xmlhttp=new ActiveXObject(“Microsoft.XMLHTTP”);
                      }
                    if (xmlhttp!=null)
                      {
                          xmlhttp.open(“GET”,url,true); //請求的方式和請求地址
                          xmlhttp.send(null);//發送請求
                          xmlhttp.onreadystatechange=state_Change;//監聽回調函數
                      }
                    else
                      {
                        alert(“你的瀏覽器不支持異步請求”);
                      }
                }

function state_Change() //這裏是回調函數(監聽服務器的應答和服務器的狀態)
                {
                    if (xmlhttp.readyState4&&xmlhttp.status200)
                     //當滿足這兩個條件時表示請求成功,完成響應 4 = “loaded”, 200 = OK  
                    { 
                        var data=xmlhttp.responseText; //拿到服務器返回的數據
                        // …our code here…在這裏進行數據返回後的操作
                    }else
                    {
                        alert(“Problem retrieving XML data”);
                    }
                }

2.原生ajax的步驟總結:
        1.HTML中,創建XMLHttpRequest對象
function getXhr(){
var xhr=null;//定義核心對象
if(window.XMLHttpRequest){//這是其他瀏覽器
xhr=new XMLHttpRequest();
}else{//這是IE
xhr=new ActiveXObject(“Microsoft.XMLHttp”);
}
return xhr;
}
var xhr=getXhr();

2.與服務器建立鏈接open()方法—其實他叫做註冊監聽
type–指定POST
對象.open(“post”,“02.php”);
            
3.向服務器發送請求數據–send()方法,post請求一定要設置setRequestHeader請求頭信息
//在這裏還是失效了,需要手動設置請求頭,必須在send()之前設置(固定寫法,必須記住)
xhr.setRequestHeader(“Content-Type”,“application/x-www.form-urlencoded”)
xhr.send(“user=adasdasd$pwd=kjkjlk”);

4.接收服務器端響應數據(這一步放在那裏都行好像)
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status=200){
var data=xhr.responseText;
console.log(data);
}
}
form表單有一個隱藏的屬性  enctype(自己下去查一查)
請求頭 content-text:裏面有
提交表單,表單請求數據主要在於這個屬性
        5.簡化的步驟:
            改變後步驟(這4個步驟,也是對的)
            1.創建核心對象(必須寫在第一步)
            2.註冊監聽(監聽服務器狀態)
                保證你請求成功
                readyState  爲4響應完畢
                可以接受responseText屬性
            3.與服務器端建立鏈接
            4.向服務器端發送請求數據
        6.註冊監聽之後服務器的5種狀態(其實,就是異步請求的過程而已)
            0:初始化,對象被創建了  new 方法被執行了
            1.已經建立了連接,和服務器  open()方法
            2.已經發送了請求  sent()  
            3.響應頭接收完畢
            4.響應體接收完畢

3.jQuery經常使用(用的是jQuery的響應)
        $.ajax({
            type:“post”,
            url:“請求的地址”,
            async:“是否支持異步刷新,默認爲true”,
            data:“需要提交的數據”,
            dataType:“服務器返回的數據”,
            success:function(data){
                
            },
            error:function(data){
                
            }
        })    
    4.關於ajax的跨域請求
        暫且不說
    5.請求頭和響應頭的區別和認識
        1.請求頭信息:
            Accept:客戶端支持的數據類型
            Accept-Charset:客戶端採用的編碼
            Accept-Encoding:客戶端支持的數據壓縮格式
            Accept-Language:客戶端的語言環境
            Cookie:客服端的cookie
            Host:請求的服務器地址
            Connection:客戶端與服務連接類型
            If-Modified-Since:上一次請求資源的緩存時間,與Last-Modified對應
            If-None-Match:客戶段緩存數據的唯一標識,與Etag對應
            Referer:發起請求的源地址。
        2.響應頭的一些信息:
            content-encoding:響應數據的壓縮格式。
            content-length:響應數據的長度。
            content-language:語言環境。
            content-type:響應數據的類型。
            Date:消息發送的時間
            Age:經過的時間
            Etag:被請求變量的實體值,用於判斷請求的資源是否發生變化
            Expires:緩存的過期時間
            Last-Modified:在服務器端最後被修改的時間
            server:服務器的型號

4.最常遇見的問題–ajax的跨域解決方案:
        1.CORS的解決方案
            CORS是一個W3C標準,全稱是”跨域資源共享”(Cross-origin resource sharing)。
            它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。
        2.跨域出現的問題:
            問題一:
                No ‘Access-Control-Allow-Origin’ header is present on the requested resource,
                並且The response had HTTP status code 404 
            原因:
                本次ajax請求是“非簡單請求”,所以請求前會發送一次預檢請求(OPTIONS)
                服務器端後臺接口沒有允許OPTIONS請求,導致無法找到對應接口地址
            問題二:
                No ‘Access-Control-Allow-Origin’ header is present on the requested resource,
                並且The response had HTTP status code 405
            原因:
                後臺方法允許OPTIONS請求,但是一些配置文件中(如安全配置),阻止了OPTIONS請求,纔會導致這個現象
                解決方案: 後端關閉對應的安全配置
            問題三:
                No ‘Access-Control-Allow-Origin’ header is present on the requested resource,
                並且status 200
            原因:
                頭部匹配時出現不匹配現象
                解決方案: 後端增加對應的頭部支持
            問題四:
               heade contains multiple values ‘,’ 
               表現現象是,後臺響應的http頭部信息有兩個Access-Control-Allow-Origin:*
3.解決跨域問題的常見方案:
            一般ajax跨域解決就是通過JSONP解決或者CORS解決,如以下:
            (注意,現在已經幾乎不會再使用JSONP了,所以JSONP瞭解下即可)
            1.爲什麼不使用jsonp
                使用script的標籤,只可以使用get方式的請求
            2.CORS如何使用
                在後臺解決吧(看起來,比較麻煩)
                http://mp.weixin.qq.com/s/AcVV08QmiK80aALk7wu5uQ
    
            3.原生的jsonp跨域解決方案:
                利用的是script標籤可以跨域的特性
                var script=document.createElement(‘script’);
                script.type=‘text/javascript’;
                
                //請求服務器,傳參,指定執行函數的返回函數 onBack
                script.src=‘http://www.baidu.com:8080/login?user=admin&callback=onBack’;
                //將元素掛載到DOM結構中
                document.head.appendChild(script);
                //執行回調函數
                function onBack(res){
                    alert(res);
                }
                理解:
                    就是給原來的頁面加一個script標籤,接收標籤請求的返回值
    
            4.利用jQUery來實現jasonp的請求()
                $.ajax({
                    url:“http://www.baidu.com:8080/login”,
                    type:‘get’,
                    dataType:‘jasonp’,
                    jasonpCallback:‘自定義的回調函數名’,
                    data:{ 需要傳遞的數據 }
                })

進行案例的測試–試一試吧

        Title    

使用jQuery 但是端口是接收jasonp的方式的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章