Professional Documents
Culture Documents
動態網頁技術
與 Ajax
23
23-1 認識動態網頁技術
23-2 認識 Ajax
23-1 認識動態網頁技術
在網際網路風行的早期,網頁只是靜態的圖文組合,使用者可以在網頁上瀏覽
資料,但無法做進一步的查詢、發表意見或進行電子商務、即時通訊、線上遊
戲、會員管理等活動,而這顯然不能滿足人們日趨多元化的需求。
為此,開始有不少人提出動態網頁的解決方案,
「動態網頁」指的是用戶端和
伺服器可以互動,也就是伺服器可以即時處理用戶端的要求,然後將結果回應
給用戶端。動態網頁通常是藉由「瀏覽器端 Scripts」和「伺服器端 Scripts」兩
種技術來完成,以下就為您做說明。
23-2
23
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title> 我的第一個 JavaScript 程式 </title>
<script language="javascript">
<!--
alert("Hello World!"); JavaScript 程式碼區塊
//-->
</script>
</head>
<body>
<h1> 歡迎光臨 !</h1>
</body>
</html>
23-3
網頁程式設計
動態網頁技術與 Ajax
23-4
23
JSP (Java Server Pages):JSP 是 Sun 公司所提出的動態網頁技術,可以在
HTML 原始檔中嵌入 Java 程式並由 Web 伺服器負責執行 ( 副檔名為 .jsp)。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title> 我的第一個 PHP 程式 </title>
</head>
<body>
<?php
echo("Hello World!");
PHP 程式碼區塊
phpinfo();
?>
</body>
</html>
<\Ch23\hello.php>
顯示 "Hello World!"
和 PHP 相關資訊
23-5
網頁程式設計
動態網頁技術與 Ajax
23-2 認識 Ajax
Ajax 是 Asynchronous JavaScript And XML 的簡寫,代表 Ajax 具有非同步、使
用 JavaScript 與 XML 等技術的特性。雖然 Ajax 的概念早在 Microsoft 於 1999
年推出 Internet Explorer 5 時,就已經存在,但並不是很受重視,直到近年來被
大量應用於 Google 網頁 ( 例如 Google Maps、Google Suggest、Gmail),才迅速
竄紅。
瀏覽器在收到資料時,便會將整個網頁內容重新顯示,所以瀏覽者通常都會看
到網頁閃一下,當網路太慢或網頁內容太大時,瀏覽者看到的可能不是一閃,
而是畫面停格,完全無法與網頁互動,相當浪費時間。
23-6
23
相反的,導入 Ajax 概念的動態網頁運作方式則如下圖,當瀏覽者變更下
拉式功能表中選取的項目、點取按鈕或做出任何與 Web 伺服器互動的動作
時,瀏覽器端會使用 JavaScript 透過 XMLHttpRequest 物件送出非同步的 Http
Request,此時只會將需要的欄位資料傳回 Web 伺服器 ( 不是全部資料 ),然後
執行指定的動作,並以 Http Response 的方式,將執行結果送回瀏覽器 ( 不包括
完全沒有變動過的資料、圖片、JavaScript 等 ),瀏覽器在收到資料後,可以使
用 JavaScript 透過 DHTML 或 DOM (Document Object Model) 來更新特定欄位。
由於整個過程均使用非同步技術,無論是將資料傳回伺服器或接收伺服器送回
的執行結果並更新特定欄位等動作,都是在背景運作,因此,瀏覽者不會看到
網頁閃一下,畫面也不會停格,瀏覽者在這個過程中仍能進行其它操作。
不會像傳統的動態網頁產生短暫空白或閃動的情況。
23-7
網頁程式設計
動態網頁技術與 Ajax
諸如臉書、撲浪
等社群網站均有
導入 Ajax 概念
23-8
23
改善使用者介面與使用者經驗:導入 Ajax 概念的網站能夠營造更友善的
使用者介面與使用者經驗,例如使用者可以在 Google Maps 網站 (http://
maps.google.com) 平順拖曳整張地圖,而不會有延遲,也不會因為點取地
圖的操作按鈕,導致網頁重新整理,而必須浪費時間等待。
23-9
網頁程式設計
動態網頁技術與 Ajax
JavaScript: 這 是 多 數 瀏 覽 器 都 支 援 的 用 戶 端 Scripts, 我 們 可 以 使 用
JavaScript 來建立用戶端瀏覽器與 Web 伺服器之間的溝通管道,也可以使
用 DOM 或 DHTML 來動態更新網頁的內容。
23-10
23
23-3 撰寫導入 Ajax 技術的動態網頁
為了讓您對網頁如何導入 Ajax 技術有初步的認識,我們將其運作過程描
繪 如 下 圖。 首 先, 使 用 JavaScipt 建 立 XMLHttpRequest 物 件; 接 著, 透
過 XMLHttpRequest 物 件 傳 送 非 同 步 Http Request,Web 伺 服 器 一 收 到 Http
Request, 就 會 執 行 預 先 寫 好 的 程 式 碼 ( 後 端 程 式 可 以 是 JSP、PHP、ASP/
ASP.NET...),再將結果以純文字或 XML 格式傳回瀏覽器;最後,仍是使用
JavaScript 根據傳回來的結果更新網頁內容,整個過程都是非同步並在背景運
作,而且瀏覽器的所有動作均是透過 JavsScript 來完成。
一、建立 XMLHttpRequest 物件
不 同 瀏 覽 器 建 立 XMLHttpRequest 物 件 的 方 式 不 同, 主 要 分 為 非 Internet
Explorer 與 Internet Explorer 兩派:
23-11
網頁程式設計
動態網頁技術與 Ajax
23-12
23
在前面的程式碼中,第 04 行是建立一個名稱為 XMLVersions、包含五個元素的
陣列,分別代表五種版本的 XMLHttpRequest 參數,愈前面的版本愈新;第 09
~ 10 行是建立 XMLHttpRequest 物件,若瀏覽器支援該版本的 XMLHttpRequest
物件,就會建立成功並離開 for 迴圈,使用 for 迴圈的目的就是為了一個一個
版本測試,直到找出瀏覽器支援的版本才停止,愈新的版本放愈前面才能保證
使用最新版。
function createXMLHttpRequest()
{
if (window.XMLHttpRequest)
return new XMLHttpRequest();
else if (window.ActiveXObject)
{
var XMLVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0",
"MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
for (var i = 0; i < XMLVersions.length; i++)
{
try
{
return new ActiveXObject(XMLVersions[i]);
}
catch (error)
{
// 不用做處理,純粹為了預防程式出錯終止
}
}
}
throw new Error(" 您的瀏覽器不支援 XMLHttpRequest 物件 ");
}
<\Ch23\utility.js>
23-13
網頁程式設計
動態網頁技術與 Ajax
2. 接 著, 在 Web 伺 服 器 接 收 到 資 料, 進 行 處 理 並 傳 回 結 果 後,
XMLHttpRequest 物 件 的 readyState 屬 性 會 變 更, 進 而 觸 發
onreadystatechange 事件,因此,我們可以藉由 onreadystatechange 事件處理
程式接收 Http Response,例如下面的敘述表示當發生 onreadystatechange 事
件時,就執行 handleStateChange() 函式,來取得 Web 伺服器傳回的結果:
XHR.onreadystatechange = handleStateChange;
send(string content )
23-14
23
綜合前面的討論,可以整理成如下:
由 於 我 們 只 能 透 過 XMLHttpRequest 物 件 的 onreadystatechange 事 件 瞭
解 Http Request 的 執 行 狀 態, 因 此, 接 收 Http Response 的 程 式 碼 是 寫 在
onreadystatechange 事件處理程式,也就是前面例子所指定的 handleStateChange()
函式。
此外,XMLHttpRequest 物件還提供了下列方法:
23-15
網頁程式設計
動態網頁技術與 Ajax
現在,我們就來看個實際應用,這個例子的執行結果如下圖,當瀏覽者點取
[ 顯示詩句 ] 按鈕時,就會讀取伺服器端的 poetry.txt 文字檔,然後將檔案內容
顯示在按鈕下面。
1 點取此鈕 2 顯示詩句
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="submit" value=" 顯示詩句 "><br><br>
<?php if (!isset($_POST["Send"])) { ?>
<input type="hidden" name="Send" value="TRUE">
<?php }
else echo file_get_contents("poetry.txt");
?>
</form>
</body>
</html>
<\Ch23\program1.php>
23-16
23
至於下面的程式則是改成導入 Ajax 技術,注意網頁的副檔名為 .html。
01:<html>
02: <head>
03: <meta http-equiv="content-type" content="text/html; charset=utf-8">
04: <script src="utility.js" type="text/javascript"></script>
05: <script type="text/javascript">
06: var XHR = null;
07:
08: function startRequest()
09: {
10: XHR = createXMLHttpRequest();
11: XHR.open("GET", "poetry.txt", true);
12: XHR.onreadystatechange = handleStateChange;
13: XHR.send(null);
14: }
15:
16: function handleStateChange()
17: {
18: if (XHR.readyState == 4)
19: {
20: if (XHR.status == 200)
21: document.getElementById("span1").innerHTML = XHR.responseText;
22: else
23: window.alert(" 檔案開啟錯誤 !");
24: }
25: }
26: </script>
27: </head>
28: <body>
29: <form id="form1">
30: <input id="button1" type="button" value=" 顯示詩句 " onclick="startRequest()">
31: <br><br> <span id="span1"></span>
32: </form>
33: </body>
34:</html>
<\Ch23\program2.html>
23-17
網頁程式設計
動態網頁技術與 Ajax
1 點取此鈕 2 顯示詩句
06: 宣 告 一 個 名 稱 為 XHR 的 全 域 變 數, 用 來 代 表 即 將 建 立 的
XMLHttpRequest 物件。
23-18
23
事實上,JavaScript 也可以在用戶端直接呼叫伺服器端的 PHP 程式,下面是一
個例子,它會呼叫伺服器端的 PHP 程式 <GetServerTime.php> 顯示格林威治標
準時間 (GMT),其執行結果如下圖。
1
2
01:<html>
02: <head>
03: <meta http-equiv="content-type" content="text/html; charset=utf-8">
04: <script type="text/javascript" src="utility.js"></script>
05: <script type="text/javascript">
06: var XHR = null;
07: function startRequest()
08: {
09: XHR = createXMLHttpRequest(); 在此呼叫伺服器端的 PHP 程式
10: XHR.open("GET", "GetServerTime.php", true);
11: XHR.onreadystatechange = handleStateChange;
12: XHR.send(null);
13: }
14:
15: function handleStateChange()
16: {
17: if (XHR.readyState == 4)
18: {
19: if (XHR.status == 200)
20: document.getElementById("span1").innerHTML = XHR.responseText;
23-19
網頁程式設計
動態網頁技術與 Ajax
21: else
22: window.alert(" 檔案開啟錯誤 !");
23: }
24: }
25: </script>
26: </head>
27: <body>
28: <form id="form1">
29: <input id="button1" type="button" value=" 顯示時間 " onclick="startRequest()">
30: <br><br><span id="span1"></span>
31: </form>
32: </body>
33:</html>
這個網頁的副檔名為 .html,表示它純粹是一個在用戶端執行的網頁,而且它
和前面的 <\Ch23\program2.html> 幾乎相同,最大的差別在於第 10 行改以 GET
方式向伺服器要求 PHP 程式 <GetServerTime.php>:
<?php
echo gmdate("Y-m-d H:i:s");
?>
<\Ch23\GetServerTime.php>
注意
想 要 在 網 頁 上 導 入 Ajax 技 術, 除 了 自 行 撰 寫 前 述 的 JavaScript 之 外, 還 有
一 些 現 成 的 套 件 可 以 使 用, 例 如 xajax、SAJAX、JPSPAN (ScriptServer)、
AJASON、flxAJAX、AjaxAC 等,您可以在 Sourceforge (http://sourceforge.net/)
進行下載。
23-20