日期: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; } ... |