推薦:asp控制xml數據庫的6段非常的經典代碼NO.1--建立一個XML數據庫data.xml <?xml version="1.0"?><records><record><name>caca</name><qq>1
7.2.4 客戶端腳本錯誤
到目前為止,我們已了解了來自ASP的錯誤。然而ASP也經常用于創建包含客戶端腳本的網頁。如果包含客戶端代碼的<SCRIPT>元素沒有被設置成RUNAT="SERVER"屬性,ASP將不考慮服務器,而把網頁信息不加改變地傳送到客戶端。
因此,如果打開了一個ASP網頁,并且顯示的是一個瀏覽器錯誤對話框,就不應該在服務器端尋找ASP程序代碼的錯誤。瀏覽器看不到ASP程序代碼,所以不能識別任何錯誤,如果有一個對話框出現在客戶端,那么在客戶端代碼中必定有一個錯誤。
1. 語法錯誤
如果在網頁中的客戶端程序代碼有語法錯誤的話,當腳本下載到客戶端,瀏覽器便會出現相應的錯誤。盡管網頁中內容仍可正常載入(除非由這些客戶端腳本代碼動態裝入),但網頁停止執行。用戶將看到一個包含錯誤細節的對話框,或者是一個指示網頁包含錯誤的狀態條消息。
現代瀏覽器趨向于隱藏網頁腳本錯誤的細節,而僅在狀態條上顯示一個小的錯誤圖標。在IE 4.0和IE 5.0中,正常的錯誤對話框可以通過Internet Options對話框的Advanced頁進行設置來激活,如圖7-14所示:
圖7-14 Advanced頁面設置屏幕
處理腳本程序代碼中的客戶端錯誤和在服務器端相似,并且通常會更容易些,因為經??梢灾苯訌姆掌髂夸浿型ㄟ^雙擊來下載網頁。一般不需要通過Web服務器和HTTP獲得網頁來觀察瀏覽器中的結果,其中的唯一不同是一些服務器交互由客戶端腳本來完成,如使用RDS的數據綁定或者動態裝入。
2. 運行期或語義錯誤
在客戶端腳本中,通??赡軙龅秸Z法錯誤,也會經常遇到運行期或語義錯誤。事實上,在客戶端,這種現象是很普遍的。因為在客戶端不能像服務器端那樣對腳本的環境進行控制,不能肯定用戶在他們的機器上正運行什么,實際上在服務器上僅能從一些組件如Browser Capabilities中得到大概情況。
所以,使用客戶端對象或特殊版本的腳本語言和屬性的腳本程序很可能不能正常工作。盡管如此,處理客戶端錯誤和處理服務器端錯誤是差不多的。
3. 在服務器上創建的客戶端程序代碼
在錯誤發生時,作為“客戶端對話框對應于ASP錯誤頁面”規則(關于出錯的地方)的一個特別的例外是,使用ASP程序代碼在服務器上動態地創建客戶端程序代碼。例如,可能想在ASP中進行求值運算,然后把數據傳給運行在客戶端的腳本代碼,可能最容易的方法是把數據作為一個變量插入腳本代碼中:
<%
' get the name of our server from the ServerVariables collection
strServerNameInASP = Request.ServerVariables("SERVER_NAME")
%>
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var strServerName = "<% = strServerNameInASP %>";
…
alert('Server name is: ' strServerName);
…
// stop hiding code
-->
</SCRIPT>
在客戶端,在ASP處理這個頁面之后,將得到的是:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var strServerName = "WROXBOX";
…
alert('Server name is: ' strServerName);
…
// stop hiding code
-->
</SCRIPT>
可以忽略RUNAT="CLIENT"屬性,但是加上這一項可以使得在查看運行代碼的ASP網頁時更加清楚。
這樣,如果在某個位置想把服務器端數據庫中的數據加入到一個客戶端數組中,可以采用下面的程序實現:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var arrBooks = new Array(10) //highest available index will be
<% ' start of ASP processing
intIndex = 0
Do While { not at the end of some recordset }
strTitle = { get title from database record }
Response.Write "arrBooks[" & CInt(intIndex) & "] = '" _
& strTitle & "'; " & vbCrlf
intIndex = intIndex 1
{ move to next record in database }
Loop
…
do something here on the client with the array of book titles
…
// stop hiding code
-->
</SCRIPT>
這段服務器端ASP程序代碼產生的客戶端代碼,在客戶端運行時創建書名標題數組。同時產生的客戶端腳本錯誤出現在瀏覽器的錯誤對話框中。錯誤的原因是以arrBooks命名的數組是由JavaScript代碼運行在客戶端時創建的,僅能接受9個書名;而服務器端代碼能很可能產生多于9個的書名,具體多少由源數據庫中的記錄數來決定。這相當于如下客戶端代碼:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var arrBooks = new Array(10) //highest available index will be
arrBooks[0] = 'Instant JavaScript';
arrBooks[1] = 'Professional ASP 3.0 Programming';
arrBooks[2] = 'ADO 2.5 Programmers Reference';
…
etc
…
arrBooks[9] = 'ASP Techniques for Webmasters';
arrBooks[10] = 'ASP Programmers Reference'; // <- client-side error occurs here
arrBooks[11] = 'ADSI CDO Programming';
arrBooks[12] = 'Professional MTS and MSMQ Programming';
…
do something here on the client with the array of book titles
…
// stop hiding code
-->
</SCRIPT>
這個頁面只有經過修正之后才能正常工作,可以通過增加數組大小,也可以通過控制來自數據庫的記錄數使其正常工作。
7.3 防止錯誤
上面已經看到了能夠出現的一些不同類型的錯誤,并且有了一些查找錯誤的感覺。下面將考慮如何避免把錯誤引入程序中,盡管不能保證所編寫的程序沒有錯誤,但是這里概括的許多技術
分享:將ASP動態網頁轉換成HTM靜態頁面的方法前段時間有個asp頁面執行起來很慢,訪問人數又頗多,而且又不經常修改,又懶得直接做成靜態的,每次都要從服務器下載來改,只好想辦法把asp頁面轉化成htm靜態頁面了。以前就曾經看到這樣的文
新聞熱點
疑難解答