傳統網頁無論新增、修改、換頁,以及排序都會有頁面重新讀取的動作 (範例)。在過去如果我們希望頁面不重新讀取、達成上述動作時,就必須藉助如「開新視窗」、「Frame 或 Iframe」、「Cookie」等方式來達成我們的目標。但不論是用那種方式,都一樣是送出一個 Request 給 Server。只是這些方式都必須產生一些不必要的元素(框架、新視窗、破圖),感覺像是一種 Hack、並不是很正規的做法。
現今我們有看到許多像 Yahoo! Map、Google Calendar 等「網路應用程式」(使用習慣類似電腦中的應用程式),如果我們還是使用過去的老式做法,頁面上一定會一大堆隱藏的 Iframe 或跳出一大堆視窗。幸好,現在我們有了 AJAX,簡單來說我們可以直接用 Javascript 去發出一個 Request,不需要產生許多累贅的東西。
微軟在 IE5 內建了一個 XMLHttpRequest 的 ActiveX 物件,讓 Javascript 可以直接傳送以及接收 XML 文件,初次用於 Outlook Web Access。如此一來就為 Javascript 賦予送出 Request 的能力。而雖然 XMLHttpRequest 以 XML 開頭,其實 Request / Receive 並不需要一定是 XML 的格式,只要是文字便可使用。
XMLHttpRequest 有兩種模式:同步 (Synchronous) 與非同步 (Asynchronous)。在 Javascript 中,同步可以以 alert()、confirm()、prompt() 等方法為例,也就是當你一執行這幾種方法,再還沒有按下確定或取消之前,下一行的程式碼都不會被執行,可以說是獨佔性的方法。
如果我們是採用同步式的 XMLHttpRequest,整個頁面必須等到 Server 傳回資料之後,才會繼續處理(以生活+為例,在拖曳地圖後,若資料還沒傳回,使用者是無法在頁面上做任何事的)。
如果是非同步 (Asynchronous) 我們則可以 setTimeout (計時器)為例,當執行了 setTimeout,不會有任何的等待時間、而會繼續執行下面的程式碼,等待時間到後,才會執行指定的 function。
所以如果我們是採用非同步式的 XMLHttpRequest,我們就不需要等待 Server 端傳送資料完畢,使用者仍然可以在頁面上繼續動作。
AJAX 只是一個商業化的名詞,全名就是 Asynchronous JavaScript XMLHttpRequest,簡單說來就是非同步的 XMLHttpRequest。
那為什麼會針對非同步呢?其實是因為同步的風險太高了,如果 Server 因為某些因素(Server負荷過大、程式錯誤...)遲遲不傳回來,那整個頁面就會無法操作,演變類似當掉的感覺。但非同步比較好的一點,如果遲遲沒有傳回來,頂多就丟掉這個 Request 即可,不會造成整個網頁無法使用。
解釋:
首先我們先寫 demo.php,只要簡單的一行 <?php echo 'Hello World!'?> 即可
另外再開一份 demo.html,下面是此網頁的的 code
如果你用 FireFox ( 範例 ) :
如果你用 IE 6 ( 範例 ) :
來整合一下吧~ ( 範例 )
經過整合,我們整理出主要的 makeRequest 函式、再搭配自訂的 Callback 處理函式,就可以重複使用 AJAX、也可以相容於 IE、FireFox、Safari 等瀏覽器。
上面的寫法似乎可以幫我們解決大多數的問題,但是,我必須誠實地告訴你、事情並沒有這麼簡單。
如果要妥善解決以上的問題,那勢必得花上許多功夫。那麼為何我們不去使用現有的一些 Javascript Libray 呢?像 Yahoo! User Interface、Prototype、、Dojo 都有類似的 AJAX Library,上述的問題便能迎刃而解了~