AJAX = Asynchronous JavaScript and XML(非同步的 JavaScript 和 XML)。

  AJAX 最大的優點是在不重新載入整個頁面的情況下,可以與伺服器交換資料並更新部分網頁內容。運用 XMLHttpRequest 或新的 Fetch API 與網頁伺服器進行非同步資料交換;AJAX 是一種用於建立快速動態網頁的技術。

AJAX是基於現有的Internet標準,並且聯合使用它們:

  XMLHttpRequest 物件 (非同步的與伺服器交換資料);

  JavaScript/DOM (資訊顯示/互動);

  CSS (給資料定義樣式);

  XML (作為轉換資料的格式)。

  AJAX應用程式與瀏覽器和平臺無關的。

一、AJAX 工作原理

  XMLHttpRequest 是 AJAX 的基礎。XMLHttpRequest 用於在後臺與伺服器交換資料。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

二、原生 JS 中的 AJAX

1、建立 XMLHttpRequest 物件

  為了應對所有的現代瀏覽器,包括 IE5 和 IE6,請檢查瀏覽器是否支援 XMLHttpRequest 物件。如果支援,則建立 XMLHttpRequest 物件。如果不支援,則建立 ActiveXObject :

var xmlhttp;

if (window.XMLHttpRequest) {

  // IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼

  xmlhttp=new XMLHttpRequest();

}

else {

  // IE6, IE5 瀏覽器執行程式碼

  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

2、AJAX - 向伺服器傳送請求

如需將請求傳送到伺服器,我們使用XMLHttpRequest物件的open()和send()方法:

open(method,url,async)

規定請求的型別、URL 以及是否非同步處理請求。

  • method:請求的型別;GET 或 POST
  • url:檔案在伺服器上的位置
  • async:true(非同步)或 false(同步)

send(string)

將請求傳送到伺服器。

string:僅用於 POST 請求

3、GET 還是 POST?

與 POST 相比,GET 更簡單也更快,並且在大部分情況下都能用。然而,在以下情況中,請使用 POST 請求:

  • 無法使用快取檔案(更新伺服器上的檔案或資料庫)
  • 向伺服器傳送大量資料(POST 沒有資料量限制)
  • 傳送包含未知字元的使用者輸入時,POST 比 GET 更穩定也更可靠

(1)GET 請求

  xmlhttp.open("GET","/try/ajax/demo_get2.php?fname=Henry&lname=Ford",true);

  xmlhttp.send();//如果希望通過 GET 方法傳送資訊,請向 URL 新增資訊。

(2) POST 請求

  xmlhttp.open("POST","/try/ajax/demo_post.php",true);

  xmlhttp.send();

如果需要像 HTML 表單那樣 POST 資料,要使用 setRequestHeader() 來新增 HTTP 頭,然後在 send() 方法中規定您希望傳送的資料:

  xmlhttp.open("POST","/try/ajax/demo_post2.php",true);

  xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");

  xmlhttp.send("fname=Henry&lname=Ford");

setRequestHeader(header,value):向請求新增 HTTP 頭。

  • header: 規定頭的名稱
  • value: 規定頭的值

  open() 方法的url引數是伺服器上檔案的地址。該檔案可以是任何型別的檔案,比如 .txt 和 .xml,或者伺服器指令碼檔案,比如 .asp 和 .php (在傳回響應之前,能夠在伺服器上執行任務)。

4、非同步 - True 或 False?

  XMLHttpRequest 物件如果要用於 AJAX 的話,其 open() 方法的 async 引數必須設定為 true。

(1) Async=true

  當使用 async=true 時,請規定在響應處於 onreadystatechange 事件中的就緒狀態時執行的函式:

xmlhttp.onreadystatechange=function() {

  if (xmlhttp.readyState==4 && xmlhttp.status==200) {

    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

  }

}

xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);

xmlhttp.send();

(2) Async = false

  如需使用 async=false,請將 open() 方法中的第三個引數改為 false,不推薦使用 async=false,但是對於一些小型的請求,也是可以的。JavaScript 會等到伺服器響應就緒才繼續執行。如果伺服器繁忙或緩慢,應用程式會掛起或停止。

  注意:當使用 async=false 時,不要編寫 onreadystatechange 函式,把程式碼放到 send() 語句後面即可

xmlhttp.open("GET","/try/ajax/ajax_info.txt",false);

xmlhttp.send();

document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

5、AJAX - 伺服器響應

  如需獲得來自伺服器的響應,請使用 XMLHttpRequest 物件的 responseText 或 responseXML 屬性。

responseText

獲得字串形式的響應資料。

responseXML

獲得 XML 形式的響應資料。

  如果來自伺服器的響應是 XML,而且需要作為 XML 物件進行解析,請使用 responseXML 屬性。

6、onreadystatechange 事件

  每當 readyState 改變時,就會觸發 onreadystatechange 事件。

  readyState 屬性存有 XMLHttpRequest 的狀態資訊。

  在 onreadystatechange 事件中,我們規定當伺服器響應已做好被處理的準備時所執行的任務。

  當 readyState 等於 4 且狀態為 200 時,表示響應已就緒:

xmlhttp.onreadystatechange=function() {

  if (xmlhttp.readyState==4 && xmlhttp.status==200) {

    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

  }

}

注意:onreadystatechange 事件被觸發 4 次(0 - 4), 分別是: 0-1、1-2、2-3、3-4,對應著 readyState 的每個變化

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function loadXMLDoc()
{
  var xmlhttp;
  if (window.XMLHttpRequest)
  {
    // IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼
    xmlhttp=new XMLHttpRequest();
  }
  else
  {
    // IE6, IE5 瀏覽器執行程式碼
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
{
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
  {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
  }
}
xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
xmlhttp.send();
}
</script>
</head>
<body>
  <div id="myDiv"><h2>使用 AJAX 修改該文字內容</h2></div>
  <button type="button" onclick="loadXMLDoc()">修改內容</button>
</body>
</html>

三、jQuery 中的 AJAX

  通過 jQuery AJAX 方法,能夠使用 HTTP Get 和 HTTP Post 從遠端伺服器上請求文字、HTML、XML 或 JSON - 同時能夠把這些外部資料直接載入網頁的被選元素中。

1、jQuery load() 方法

  load() 方法從伺服器載入資料,並把返回的資料放入被選元素中。

語法:

  $(selector).load(URL,data,callback);

    必需的URL引數規定希望載入的 URL。

    可選的data引數規定與請求一同傳送的查詢字串鍵/值對集合。

    可選的callback引數是 load() 方法完成後所執行的函式名稱。

    也可以把 jQuery 選擇器新增到 URL 引數。

eg  $("#div1").load("demo_test.txt #p1");

可選的 callback 引數規定當 load() 方法完成後所要允許的回撥函式。回撥函式可以設定不同的引數:

  • responseTxt- 包含呼叫成功時的結果內容
  • statusTXT- 包含呼叫的狀態
  • xhr- 包含 XMLHttpRequest 物件

$("button").click(function(){

  $("#div1").load("demo_test.txt",function(responseTxt,statusTxt,xhr){

  if(statusTxt=="success")

    alert("外部內容載入成功!");

  if(statusTxt=="error")

    alert("Error: "+xhr.status+": "+xhr.statusText);

  });

});

2、jQuery $.get() 方法

  $.get() 方法通過 HTTP GET 請求從伺服器上請求資料。

語法:

  $.get(URL,callback);

    必需的URL引數規定希望請求的 URL。

    可選的callback引數是請求成功後所執行的函式名。

$("button").click(function(){

  $.get("demo_test.php",function(data,status){

    alert("資料: " + data + "\n狀態: " + status);

  });

});

第二個引數是回撥函式。第一個回撥引數存有被請求頁面的內容,第二個回撥引數存有請求的狀態。

3、jQuery $.post() 方法

  $.post() 方法通過 HTTP POST 請求向伺服器提交資料。

語法:

  $.post(URL,data,callback);

    必需的URL引數規定您希望請求的 URL。

    可選的data引數規定連同請求傳送的資料。

    可選的callback引數是請求成功後所執行的函式名。

$("button").click(function(){

  $.post("/try/ajax/demo_test_post.php",

  {

  name:"菜鳥教程",

  url:"http://www.runoob.com"

  },

  function(data,status){

    alert("資料: \n" + data + "\n狀態: " + status);

  });

});

4、GET 和 POST 方法的區別

  1、傳送的資料數量

    在 GET 中,只能傳送有限數量的資料,因為資料是在 URL 中傳送的。

    在 POST 中,可以傳送大量的資料,因為資料是在正文主體中傳送的。

  2、安全性

    GET 方法傳送的資料不受保護,因為資料在 URL 欄中公開,這增加了漏洞和黑客攻擊的風險。

    POST 方法傳送的資料是安全的,因為資料未在 URL 欄中公開,還可以在其中使用多種編碼技術,這使其具有彈性。

  3、加入書籤中

    GET 查詢的結果可以加入書籤中,因為它以 URL 的形式存在;而 POST 查詢的結果無法加入書籤中。

  4、編碼

    在表單中使用 GET 方法時,資料型別中只接受 ASCII 字元。

    在表單提交時,POST 方法不繫結表單資料型別,並允許二進位制和 ASCII 字元。

  5、可變大小

    GET 方法中的可變大小約為 2000 個字元。

    POST 方法最多允許 8 Mb 的可變大小。

  6、快取

    GET 方法的資料是可快取的,而 POST 方法的資料是無法快取的。

  7、主要作用

    GET 方法主要用於獲取資訊。而 POST 方法主要用於更新資料。