我們已經介紹了Ajax,下面來簡單談談遠程指令碼。你可能會想:“Ajax有什麼大不了的?我早就用IFRAME做過同樣的事情。”實際上,我們自己也曾用過這種方法。這在以前一般稱為遠程指令碼(remote scripting),很多人認為這隻是一種修修補補。不過,這確實提供了一種能避免頁面重新整理的機制。
2.5.1 遠程指令碼概述
基本說來,遠程指令碼是一種遠端程序呼叫類型。你可以像正常的Web應用一樣與伺服器互動,但是不用重新整理整個頁面。與Ajax類似,你可以調用任何伺服器端技術來接收請求、處理請求並返回一個有意義的結果。正如在伺服器端有很多選擇,用戶端同樣有許多實現遠程指令碼的選擇。你可以在應用中嵌入Flash動畫、Java applet,或者ActiveX組件,甚至可以使用XML-RPC,但是這種方法過於複雜,因此除非你使用這種技術很有經驗,否則這種方法不太合適。實現遠程指令碼的通常做法包括將指令碼與一個IFRAME(隱藏或不隱藏)結合,以及由伺服器返回JavaScript,然後再在瀏覽器中運行這個JavaScript。
Microsoft提供了自己的遠程指令碼解決方案,並聰明地稱之為Microsoft遠程指令碼(Microsoft Remote Scripting,MSRS)。採用這種方法,可以像調用本地指令碼一樣調用伺服器指令碼。頁面中嵌入Java applet,以便與伺服器通訊,.asp頁面用於放置伺服器端指令碼,並用.htm檔案管理用戶端的布局擺放。在Netscape和IE 4.0及更高版本中都可以使用Microsoft的這種解決方案,可以同步調用,也可以非同步呼叫。不過,這種解決方案需要Java,這意味著可能還需要附加的安裝常式,而且還需要Internet Information Services(IIS),因此會限制伺服器端的選擇。
Brent Ashley為遠程指令碼建立了兩個免費的跨平台庫。JSRS是一個用戶端JavaScript庫,它充分利用DHTML向伺服器做遠程調用。相當多的作業系統和瀏覽器上都能使用JSRS。如果採用一些常用的、流行的伺服器端實現(如PHP、Python和Perl CGI),JSRS一般都能在網站上安裝並運行。Ashley免費提供了JSRS,而且還可以從他的網站(www.ashleyit.com/rs/main.htm)上得到原始碼。
如果你覺得JSRS太過笨重,Ashley還建立了RSLite,這個庫使用了cookie。RSLite僅限於少量資料和單一調用,不過大多數瀏覽器都能提供支援。
2.5.2 遠程指令碼的樣本
為了進行比較,這裡向你展示如何使用IFRAME來實作類別似Ajax的技術。這非常簡單,而且過去我們就用過這種方法(在XMLHttpRequest問世之前)。這個樣本並沒有真正調用伺服器,只是想讓你對如何使用IFRAME實現遠程指令碼有所認識。
這個樣本包括兩個檔案:iframe.html(見代碼清單2-2)和server.html(見代碼清單2-3)。server.html類比了本應從伺服器返回的響應。
代碼清單2-2 iframe.html檔案
<html>
<head>
<title>Example of remote scripting in an IFRAME</title>
</head>
<script type="text/javascript">
function handleResponse() {
alert('this function is called from server.html');
}
</script>
<body>
<h1>Remote Scripting with an IFRAME</h1>
<iframe id="beforexhr"
name="beforexhr"
style="width:0px; height:0px; border: 0px"
src="blank.html"></iframe>
<a href="server.html" target="beforexhr">call the server</a>
</body>
</html>