1. 程式人生 > >原生JS寫Ajax

原生JS寫Ajax

打電話的流程
1.手機
2.撥號
3.說話
4.聽

從伺服器上取資料
1.建立ajax物件
2.連線到伺服器
3.傳送請求
4.接收返回值
html檔案的程式碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="new_ajax.js"></script>
    <script>
        window.onload=function () {
            var oBtn=document.getElementById("btn1");
            oBtn.onclick=function () {
                ajax("a.txt",function (str) {
                    alert(str);
                })

            }
        }
    </script>
</head>
<body>
<button id="btn1">讀取</button>
</body>
</html>
JS檔案,命名為new_ajax.js的程式碼
function ajax(url,fnSucc,fnFaild) {
    //    1.建立Ajax物件
    //    非IE6
    //     var oAjax=new XMLHttpRequest();
    //     alert(oAjax);
    //    IE6
    //     var oAjax=new ActiveXObject("Microsoft.XMLHTTP");
    //     alert(oAjax);
    /*
    為什麼要寫window.XMLHttpRequest而不是XMLHttpRequest而不是?
    在JS中,變數即是window的屬性。
    alert(a);報錯
    alert(window.a);undefined
    那麼如果寫成 if(XMLHttpRequest),將會直接報錯,而寫成if(window.XMLHttpRequest)才能正常判斷
    * */
    if(window.XMLHttpRequest)
    {
        var oAjax=new XMLHttpRequest();
    }
    else
    {
        var oAjax=new ActiveXObject("Microsoft.XMLHTTP");
    }

    //    2.連線伺服器
    //    open(方法:GET/POST,檔名)
    /*
    * 同步:事件一件一件來
    * 非同步:多個事情可以一起做(剛好和人們的正常思維相反)
    * Ajax一般用非同步方式,若用同步,在向伺服器傳送請求的時候什麼也做不了,true代表非同步
    * */
    oAjax.open('GET',url,true);
    //    3.傳送請求
    oAjax.send();
    //    4.接收返回

    oAjax.onreadystatechange=function () {
        // oAjax.readyState   //瀏覽器和伺服器,進行到哪一步了
        /*
   0 (未初始化)還沒有呼叫open方法
   1(載入)已呼叫send()方法,正在傳送請求
   2(載入完成)send()方法完成,已收到全部響應內容
   3(解析)正在解析響應內容
   4(完成)響應內容解析完成,可以在客戶端呼叫了
  * */
        if(oAjax.readyState==4)//讀取完成,完成不代表成功
        {
            if(oAjax.status==200)  //成功
            {
                fnSucc(oAjax.responseText);
            }
            else
            {
                if(fnFaild)
                {
                    fnFaild(oAjax.status);
                }
            }
        }
    }
}