今天簡單的學習了 Ajax 的基礎知識,總結在這裏。部分代碼不是原創,特此說明。javascript
【Ajax 簡介】php
AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。經過在後臺與服務器進行少許數據交換,AJAX 可使網頁實現異步更新。這意味着能夠在不從新加載整個網頁的狀況下,對網頁的某部分進行更新。有不少使用 AJAX 的應用程序案例:新浪微博、Google 地圖、開心網等等。例如當咱們在谷歌的搜索框輸入關鍵字時,JavaScript 會把這些字符發送到服務器,而後服務器會返回一個搜索建議的列表。以下圖所示:java
【XMLHttpRequest】數組
首先咱們介紹 XMLHttpRequest 。XMLHttpRequest 是 AJAX 的基礎。爲了應對全部的現代瀏覽器,包括 IE5 和 IE6,在建立 XMLHttpRequest 對象以前,咱們須要檢查瀏覽器是否支持 XMLHttpRequest 對象。若是支持,則建立 XMLHttpRequest 對象。若是不支持,則建立 ActiveXObject,代碼以下:瀏覽器
var xmlhttp; if(window.XMLHttpRequest){ // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else{ // code for IE6, IE5 xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); }
如需將請求發送到服務器,咱們使用 XMLHttpRequest 對象的 open() 和 send() 方法:服務器
xmlhttp.open(method,url,async);
xmlhttp.send();
這裏的 open 方法有三個參數,分別是 method, url, async, 表明以下意思:異步
method :規定請求的類型,有 GET 和 POST 兩種async
url :請求的服務器文件的 url 函數
async :規定是否異步處理請求,true(異步)或 false(同步)學習
如需得到來自服務器的響應,請使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性。若是來自服務器的響應並不是 XML,請使用 responseText 屬性。若是來自服務器的響應是 XML,並且須要做爲 XML 對象進行解析,請使用 responseXML 屬性。
當請求被髮送到服務器時,咱們須要執行一些基於響應的任務。每當 readyState 改變時,就會觸發 onreadystatechange 事件。readyState 屬性存有 XMLHttpRequest 的狀態信息。下面是 XMLHttpRequest 對象的三個重要的屬性:
屬性 | 描述 |
onreadystatechange | 存儲函數(或函數名),每當 readyState 屬性改變時,就會調用該函數。 |
readyState | 存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。
|
status | 200: "OK" 404: 未找到頁面 |
當 readyState 等於 4 且狀態爲 200 時,表示響應已就緒:
xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }
【Ajax 實例】
如今咱們建立一個相似 google 的搜索框,達到以下的效果:
咱們在搜索框內輸入內容,服務器自動分析已有內容進行匹配。首先咱們建立 HTML 頁面,代碼以下:
<h1>請在下面的輸入框內鍵入字母(A - Z)</h1> <form action=""> 姓氏:<input type="text" id="txt1" onkeyup="showHint(this.value)" /> </form> <p>建議:<span id="txtHint"></span></p>
javascript 代碼以下:
//定義相應 onkeyup 的函數 function showHint(str){ var xmlhttp; //若是用戶輸入內容爲空,HTML 頁面不顯示任何數據 if(str.length == 0){ document.getElementById('txtHint').innerHTML = ''; return; } //檢查瀏覽器是否支持 XMLHttpRequest 對象 if(window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); } else{ xmlhttp = ActiveXObject('Microsoft.XMLHTTP'); } //規定在響應處於 onreadystatechange 事件中的就緒狀態時執行的函數 xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4 && xmlhttp.status == 200){ document.getElementById('txtHint').innerHTML = xmlhttp.responseText; } } xmlhttp.open('GET','eg22.php?q='+str,true); xmlhttp.send(); }
能夠看到咱們在請求 eg22.php 頁面的信息,相應的 PHP 頁面代碼以下:
<?php // 用名字來填充數組 $a[]="Anna"; $a[]="Brittany"; $a[]="Cinderella"; $a[]="Diana"; $a[]="Eva"; $a[]="Fiona"; $a[]="Gunda"; $a[]="Hege"; $a[]="Inga"; $a[]="Johanna"; $a[]="Kitty"; $a[]="Linda"; $a[]="Nina"; $a[]="Ophelia"; $a[]="Petunia"; $a[]="Amanda"; $a[]="Raquel"; $a[]="Cindy"; $a[]="Doris"; $a[]="Eve"; $a[]="Evita"; $a[]="Sunniva"; $a[]="Tove"; $a[]="Unni"; $a[]="Violet"; $a[]="Liza"; $a[]="Elizabeth"; $a[]="Ellen"; $a[]="Wenche"; $a[]="Vicky"; //得到來自 URL 的 q 參數 $q=$_GET["q"]; //若是 q 大於 0,則查找數組中的全部提示 if (strlen($q) > 0) { $hint=""; for($i=0; $i<count($a); $i++) { if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q)))) { if ($hint=="") { $hint=$a[$i]; } else { $hint=$hint." , ".$a[$i]; } } } } // 若是未找到提示,則把輸出設置爲 "no suggestion" // 不然設置爲正確的值 if ($hint == "") { $response="no suggestion"; } else { $response=$hint; } //輸出響應 echo $response; ?>
源代碼解釋:
若是輸入框爲空 (str.length==0),則該函數清空 txtHint 佔位符的內容,並退出函數。
若是輸入框不爲空,showHint() 函數執行如下任務:
到目前爲止咱們已經完成了目標工做。須要注意的一點是,若是使用 async=false 時,請不要編寫 onreadystatechange 函數 - 把代碼放到 send() 語句後面便可。