
日期:2006-09-28 作者:喜騰小二 來源:PHPChina
多年以來,建立真正俱有回應性的 Web 應用程式這一目的一直被 Web
開發的一個簡單事實所阻礙:要改變页面某一部分的資訊,使用者就必須多載整個页面。但是以後不再會這樣了。感謝非同步 Javascript 指令檔和
XML(Ajax),我們現在可以從伺服器端請求新內容,隻修改页面的一部分。這個教程解釋了如何把 Ajax 用於 PHP ,並介紹了簡單 Ajax
工俱包(Sajax),這是一個用 PHP 編寫的工俱,可以把伺服器端 PHP 與 JavaScript 整合。
開始之前
這份教程針對的是對於開發富 Web 應用程式感興趣的人,富 Web 應用程式把非同步
JavaScript 和 XML(Ajax)與 PHP 結合起來,使用者每次按時,不必重新整理整個页面,就可以動態更新內容。這份教程假設讀者瞭解基本的 PHP
概念,包括 if 和 switch 陳述式以及函式的使用。
關於本教程
在本教程中,將學習 Ajax
以及圍繞它的應用的問題。將用 PHP 建置一個 Ajax
應用程式,顯示以前寫的一個教程中的麵闆。按麵闆連結隻會重新載入內容區,並用選定麵闆的內容取代它,從而節約了頻寬和页面裝入的時間。然後將把簡單 Ajax
工俱包(Sajax)整合進 Ajax 應用程式,它可以同步 Ajax
的使用,從而簡化開發。
概述
在深入之前,先看看 Ajax、範例 PHP 應用程式和 Sajax。
Ajax
Ajax 允許 Web 開發人員建立互動的 Web 页面,同時避免必須等候页面載入這一瓶頸。透過 Ajax
建立的應用程式,隻需按按鈕,就可以用全新的內容取代 Web 页面某一區網域的內容。它的精彩之處在於不必等候页面裝入,隻有這一個區網域的內容需要載入。以
Google Maps 為例:可以按和四處移動地圖,卻不必等候页面載入。
Ajax 的問題
在使用 Ajax
時有些事需要注意。像其他 Web 页面一樣,Ajax 页面是可以加書簽的,所以在使用 GET 與 POST
進行請求時就會造成問題。國際化和編碼方案數量的增加,使得把這些編碼方案標準化變得日益重要。在這份教程中將瞭解這些重要的問題。
範例
PHP 應用程式
首先要用 Ajax 建立一個應用程式,然後用 Sajax
建立,以展現使用這個工俱包的好處。應用程式是以前編寫的教程中的一部分,帶有麵闆連結。它被用作範例,以展示使用 Ajax
的優勢。因為在各個麵闆上按時,它們會非同步裝入,而不必等候页面剩下的部分再次裝入。這個範例應用程式還會展示如何建立自己的 Ajax
應用程式。
Sajax
如果想建立 Ajax 應用程式,又不想受 Ajax 復雜的細節所累。答案就是
Sajax。透過使用 ModernMethod 人員開發的庫,Sajax 為 Web 開發人員抽象出了 Ajax 的高層細節。在底層,Sajax 的工作與
Ajax 相同。但是,透過使用 Sajax 庫提供的高層函式,可以略過 Ajax 的技術細節。
什麼是
Ajax?
這一節是個入門介紹,用範例解釋 Ajax 的概念,包括在按連結時發生了什麼,Ajax 用於 PHP 應用程式時需要的
HTML 和 JavaScript 程式碼。下一節將更深入一些,實際地使用在這一節學習的 Ajax 概念建立 PHP
應用程式。
幕後內容
Ajax 是非同步 JavaScript 和 XML
的組合。之所以說非同步,是因為可以按页面上的連結,然後它隻裝入與按對應的內容,同時保持標題或其他任何設定的資訊不動。
按連結時,在背後工作的是
JavaScript 函式。JavaScript 建立與 Web
浏覽器通信的物件,並告訴浏覽器裝入特定页面。然後可以像平常一樣浏覽同一页面上的其他內容,當浏覽器完全裝入新页面的時候,浏覽器會在 HTML 的 div
標記指定的位置顯示內容。
CSS 樣式程式碼用來和 span 標記一起建立連結。
CSS
樣式程式碼
範例應用程式需要 CSS 程式碼,這樣 span 標記看起來就像使用常規的錨標記(<a href=...
>)建立的真正連結一樣,也會像真正的連結一樣被按。
清單 1. 指定 span 標記的顯示資訊
| ... <style type="text/css"> span:visited{ text-decoration:none; color:#293d6b; } span:hover{ text-decoration:underline; color:#293d6b; } span {color:#293d6b; cursor: pointer} </style> |
| <span onclick="loadHTML('panels-ajax.php?panel_id=0', 'content')">Managing content</span> |
| ... <style> <script type="text/javascript"> var request; var dest; function loadHTML(URL, destination){ dest = destination; if(window.XMLHttpRequest){ request = new XMLHttpRequest(); request.onreadystatechange = processStateChange; request.open("GET", URL, true); request.send(null); } } </script> ... |
| ... function loadHTML(URL, destination){ dest = destination; if(window.XMLHttpRequest){ ... } else if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); if (request) { request.onreadystatechange = processStateChange; request.open("GET", URL, true); request.send(); } } } </script> |
| ... var dest; function processStateChange(){ if (request.readyState == 4){ contentDiv = document.getElementById(dest); if (request.status == 200){ response = request.responseText; contentDiv.innerHTML = response;http://httpd.apache.org/download.cgi } } } function loadHTML(URL, destination){ ... |
| ... if (request.status == 200){ response = request.responseText; contentDiv.innerHTML = response; } else { contentDiv.innerHTML = "Error: Status "+request.status; } ... |