原生Ajax寫法


一. Ajax 是什么?

  • 全稱Asynchronous JavaScript and XML
  • 異步的 JavaScript 和 XML;
  • 可以在不重新加載整個頁面的情況下,與服務器交換數據並更新部分網頁內容;
  • 能夠實現局部刷新,大大降低了資源的浪費;
  • 不需要任何瀏覽器插件,但需要用戶允許JavaScript在瀏覽器上執行;
  • 是一門用於創建快速動態網頁的技術;
  • 傳統的網頁(不使用 AJAX)如果需要更新內容,必須重載整個網頁;

二. Ajax工作原理

簡單來說就是 通過XmlHttpRequest對象向服務器發異步請求,從服務器獲得數據,然后用 javascript 來操作DOM更新頁面的技術。

三. Ajax的使用

Ajax的使用分為四部分:
1.) 創建一個XMLHttpRequest對象;
1. 兼容IE低版本瀏覽器(ie5-ie6);
2. 使用if,else或者try,catch;
2.) 配置請求信息;
1. 請求的方式;
2. 請求文件的路徑;
3. 是否異步,默認為true;
3.)發送請求;
1. get與post的區別;
2. get與post的使用場景;
4.) 監聽狀態變化,執行相應回調函數;
1. http狀態碼都有哪些?
2. 不同狀態碼代表的含義?

3.1 創建XMLHttpRequest對象

目前所有的現代瀏覽器(包括IE7+、Firefox、Chrome、Safari 以及 Opera)均內建有 XMLHttpRequest 對象,寫法如下:

var xhr = new XMLHttpRequest();

低版本的 IE 瀏覽器 (主要指 IE5 和 IE6)沒有XMLHttpRequest 對象,使用 ActiveXObject 對象,寫法如下:

var xhr =new ActiveXObject("Microsoft.XMLHTTP");

舉個兼容性寫法的例子:

為了兼容所有的現代瀏覽器,包括 IE5 和 IE6,需要判斷瀏覽器是否支持 XMLHttpRequest 對象。如果支持,則創建 XMLHttpRequest 對象。如果不支持,則創建 ActiveXObject :

var xhr; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼 xhr = new XMLHttpRequest(); } else { // IE6, IE5 瀏覽器執行代碼 xhr = new ActiveXObject("Microsoft.XMLHTTP"); } 

3.2 向服務器發送請求

使用 XMLHttpRequest 對象的 open() 和 send() 方法:

方法 參數配置
open(method, url, async) method:請求的類型, GET 或 POST;url:文件在服務器上的位置;async:布爾值,判斷是否異步,true為異步(默認)或 false為同步;
send(string) string:參數,get不傳參,僅用於 POST 請求

注意:

  • 不推薦使用 async=false,但是對於一些小型的請求,也是可以的。
  • 請記住,JavaScript 會等到服務器響應就緒才繼續執行。如果服務器繁忙或緩慢,應用程序會掛起或停止。
  • 當你使用 async=false 時,后面不要寫 onreadystatechange 函數 - 直接把代碼放到 send() 語句后面即可:
    xhr.open("GET","/try/ajax/ajax_demo.txt",false); xhr.send(); document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 

舉個栗子:

// 使用get方法請求服務器上的1.txt文件 xhr.open("GET","1.txt",true); xhr.send(); 

3.2.2 GET與POST的區別

  • 與 POST 相比,GET 更簡單也更快,並且在大部分情況下都能用;
  • GET存在緩存問題,使用GET方法一定要記得清除緩存,不然請求的數據不是最新的;
  • GET不安全,明文傳輸,POST更安全;
  • GET適用於小文件,POST沒有數量限制;
  • GET使用send方法時不傳參,POST必須傳參;

3.2.3 只能使用 POST 請求的情況

  • 無法使用緩存文件(更新服務器上的文件或數據庫)
  • 向服務器發送大量數據(POST 沒有數據量限制)
  • 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠

3.2.4 怎么使用POST發送數據?

它其實就類似於 HTML 表單那樣 POST 數據,我們需要使用 setRequestHeader() 來添加 HTTP 頭。然后在 send() 方法中寫要發送的數據:
向請求添加 HTTP 頭方法如下:

xhr.setRequestHeader(header,value); // header: 規定頭的名稱; // value: 規定頭的值; 
xhr.open("POST","/try/ajax/demo_post2.php",true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhr.send("fname=Zhou&lname=minghang"); 

3.4 監聽事件變化

  • 如果是同步請求的話,不需要寫監聽事件變化函數;
  • 一般默認都是異步請求,才寫監聽函數;

異步請求時的監聽事件變化函數如下:

    xhr.onreadystatechange=function() { if (xhr.readyState==4 && xhr.status==200){ document.getElementById("myDiv").innerHTML = xhr.responseText; }else{ console.log('失敗了'); } } 

3.4.2 onreadystatechange 事件

  • 當請求被發送到服務器時,我們需要執行一些基於響應的任務。
  • 每當 readyState 改變時,就會觸發 onreadystatechange 事件。
  • readyState 屬性存有 XMLHttpRequest 的狀態信息。

3.4.2.1 onreadystatechange屬性的作用?

存儲函數(或函數名),每當 readyState 屬性改變時,就會調用該函數。

3.4.2.2 readyState屬性的作用?都有哪些狀態?

  • 存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。
    • 0: 請求未初始化
    • 1: 服務器連接已建立
    • 2: 請求已接收
    • 3: 請求處理中
    • 4: 請求已完成,且響應已就緒

一般常見的狀態碼有:

  • 200:"OK, 成功"
  • 404: "頁面找不到"

狀態碼具體含義:

  • 200:服務器響應正常。
  • 304:該資源在上次請求之后沒有任何修改(這通常用於瀏覽器的緩存機制,使用GET請求時尤其需要注意)。
  • 400:無法找到請求的資源。
  • 401:訪問資源的權限不夠。
  • 403:沒有權限訪問資源。
  • 404:需要訪問的資源不存在。
  • 405:需要訪問的資源被禁止。
  • 407:訪問的資源需要代理身份驗證。
  • 414:請求的URL太長。
  • 500:服務器內部錯誤。

四. 怎么處理服務器反饋的數據?

如果我們想獲得服務器上的數據,並進行相應的操作,這就要用到XMLHttpRequest 對象的 responseTextresponseXML 屬性。

  • responseText屬性:
    • 獲得字符串形式的響應數據;
    • 如果來自服務器的響應並非 XML,請使用 responseText 屬性;
    • responseText 屬性返回字符串 形式的響應;
    document.getElementById("myDiv").innerHTML=xhr.responseText; 
  • responseXML屬性:
    • 獲得 XML 形式的響應數據。
    • 如果來自服務器的響應是 XML,而且需要作為 XML 對象進行解析,請使用 responseXML 屬性:
    xmlDoc=xmlhttp.responseXML;
    txt="";
    x=xmlDoc.getElementsByTagName("ARTIST");
    for (i=0;i<x.length;i++)
    {
        txt=txt + x[i].childNodes[0].nodeValue + "<br>";
    }
    

document.getElementById("myDiv").innerHTML=txt;




原文鏈接:https://www.jianshu.com/p/2be2e4f1fc8e


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM