編程|進階 (1) 建立一個內容頁面
我們已經使用Content Linking組件為本章提供的樣本建立了菜單頁面。Chapter06檔案夾中的頁面Default.htm採用上述代碼建立菜單,如圖6-2所示:
圖6-2 使用Content Linking組件建立的菜單頁面
可以看到內容連結清單檔案的內容顯示在連結的下面,我們使用FileSystemObject對象完成這一工作。
<%
'create an instance of a FileSystemObject object
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
'open the text file as a TextStream object
Set objTStream = objFSO.OpenTextFile(Server.MapPath("contlink.txt"), ForReading)
Response.Write objTStream.ReadAll 'read the whole file and put into page
ObjTStream.Close
%>
如果你編輯了contlink.txt檔案,下次再次調用這個頁面時,會看到菜單的條目發生了變化。注意檔案中的最後三個條目,這三個條目使用前面介紹的redirect.asp技術,把絕對(而不是相對)的URL插入到列表中。
(2) 瀏覽這些頁面
建立一個Content Linking組件執行個體並且使用它的一個方法時,將把當前頁面的URL與指定的內容連結清單檔案中的條目相匹配。不僅能用該組件建立一個內容列表(就像剛看到的那樣),而且當在瀏覽器上開啟其中一個頁面時,可以用該組件對列表中的各個頁面進行導航。
這意味著可以用超連結或按鈕從這些頁面中的一個移到另一個。例如,可以給頁面添加Next和Back按鈕,通過使用GetNextURL和GetPreviousURL方法能知道列表中的哪一個頁面是前一個,哪一個頁面是下一個。另一方面,能用GetNthURL方法跳到列表中的任何頁面,用GetListIndex方法能知道當前頁面在列表中的位置。
下面是一段給頁面添加Next和Back按鈕的代碼,我們要做的只是把這段程式放在內容連結檔案所列出的每一頁中,或者用SSI的#include指令將它插入其中。
<!-- need a form to force Navigator to display the buttons -->
<FORM ACTION="">
<%
'we'll insert this into each page using an SSI #include statement
'create an instance of the Content Linking component
Set objNextLink = Server.CreateObject("MSWC.NextLink")
'set the content linking list file path and name
strListFile = "contlink.txt"
'get the index of the current page in the list
intThisPage = objNextLink.GetListIndex(strListFile)
If intThisPage > 1 Then 'can go back
%>
<INPUT TYPE=BUTTON VALUE="< Back"
ONCLICK="location.href='<% = objNextLink.GetPreviousURL(strListFile) %>';"
TITLE="Go to '<% = objNextLink.GetPreviousDescription(strListFile) %>'">
<%
End If
%>
<INPUT TYPE=BUTTON VALUE=" Menu " ONCLICK="location.href='default.asp';"
TITLE="Return to the main 'Installable Components' menu">
<%
If intThisPage < objNextLink.GetListCount(strListFile) Then 'can go forward
%>
<INPUT TYPE=BUTTON VALUE="Next >"
ONCLICK="location.href='<%= objNextLink.GetNextURL(strListFile) %>';"
TITLE="Go to '<% = objNextLink.GetNextDescription(strListFile) %>'">
<%
End If
%>
</FORM>
第一步是建立Content Linking組件,然後把列表檔案名稱存入一個變數中,以便後面在建立頁面裡的用戶端JScript代碼時能夠使用這個列表檔案。另外這樣做也便於頁面的維護,因為如果想使用一個不同檔案名稱僅需在一個地方改變就可以了。
現在讓我們瞭解一下在連結清單中所處的位置。GetListIndex方法提供當前頁面的索引號,從列表中的第一頁開始。如果當前頁面的索引號比1大,那麼可以後退,所以我們在頁面中建立Back按鈕。如果當前頁面的索引號比列表中的項數少,建立Next按鈕。頁面中總是包括一個Home按鈕,以便訪問者在任何時候都能輕易地返回到內容頁面。
如果開啟列在主菜單中的頁面之一的話,將會看到使用這項技術在每個頁面上建立的一系列導覽按鈕,建立按鈕的代碼在檔案contlinkbuttons.inc中,可用#include指令將它插入每個頁面中。圖6-3所示為帶有按鈕的介面。
圖6-3 帶有按鈕的介面
在圖6-3中有三個按鈕,使用GetPreviousDescription方法獲得上個頁面的連結檔案,並把這個文本放入Back按鈕的TITLE屬性中,作為彈出的提示。
<INPUT TYPE=BUTTON VALUE="< Back"
ONCLICK="location.href='<% = objNextLink.GetPreviousURL(strListFile) %>';"
TITLE="Go to '<% = objNextLink.GetPreviousDescription(strListFile) %>'">
Next按鈕採用GetNextDescription方法完成類似的工作。
(3) 用JavaScript跳轉
這些導覽按鈕使用JavaScript(而不是VBScript)裝載新頁面,這樣就能夠和大多數現代瀏覽器安全色。例如Back按鈕包含下面的屬性:
ONLICK="location.here='<% = objNextLink.GetPreviousURL(strListFile) %>'; "
當頁面的HTML版本由ASP建立時,在<%…%>標記中的運算式用其數值取代,所以發往瀏覽器的網頁看起來如下所示:
ONCLICK="location.herf='permissionchecker.asp'; "
為什麼選擇使用變數來表示內容連結清單檔案的名字?其原因是在單個語句中包括一個三層的嵌套引用是非常麻煩的。
注意瀏覽器的預設語言是JavaScript(或IE中的JScript),而不是VBScript,通過使用Ja