首先我們先來了解一下ASP頁面執行的流程 1.IIS找到ASP文件,提交給ASP引擎(一般是ASP.DLL)處理。 2.引擎打開這個ASP文件,找出<%和%>之間的內容,當然還有<script runAt="server">和對應的</script>之間的內容,這些內容稱為腳本塊。只有腳本塊里的內容被引擎解析,其他內容不管,作為沒有意義的字符插在腳本塊之間。有必要說明一下的是,其實被解析的內容還不止這些,<!--#include ***-->類的服務器端包含文件也是由引擎包含進來并加以處理的。如果你讀的程序比較多,你還會知道有的runAt屬性標注為"Server"的<object>對象也是會被處理的,這里不做深入討論。 3.引擎執行腳本塊中的腳本,這些服務器端的腳本是作為一個整體被執行的,也就是說,可以寫出如下的代碼: <% Dim i For i=1 to 5 %> Hello World! <% Next %> 引擎并不會將這些腳本塊分開解析,而使兩個腳本塊都發生語法錯誤。所以我們得到如下結論:并非所有非服務器腳本的代碼都會被發送到客戶端,有可能這段非服務器腳本的代碼被腳本塊限制了。服務器是一定不會操心客戶端腳本的執行問題的,但是可以通過服務器端的腳本輸出不同的客戶端腳本。 4.最終引擎產生了一個文本流,或者說是腳本的執行結果,可以認為這是一個字符串,就是發送到客戶端瀏覽器的網頁的代碼??蛻舳藶g覽器將頁面顯示出來,此時頁面的源代碼(源文件)是不包含服務器端的腳本的,但包含了服務器端腳本的執行結果(這是顯然的)。
典型錯誤 <% Function TSize(b) '這是我自定義的函數 TSize="中國" end function %> <a href="javascript:<%TSize('變量')%>" >點這里要使用我定義的函數</a> 錯誤分析: 混淆了服務器端腳本和客戶端腳本的區別。實際執行時我們會發現,客戶端根本沒有收到什么TSize之類的代碼,因為TSize是服務器端的程序,被引擎處理之后(注意引擎對于函數的處理,純粹是給服務器端腳本調用的,不會發回到客戶端)就消失了,不可能在客戶端起作用。這就是說,客戶端腳本無法直接調用服務器端腳本的函數。 事實上,這個程序是有語法錯誤的,引擎處理這段內容的時候先找到了<%和%>之間的內容,也就是<%TSize('變量')%>,顯然這段內容不符合VBScript的語法規則。嗯,改成<%=TSize("變量")%>在服務器端腳本就沒有語法錯誤了,這時TSize函數可以正常返回值"中國",于是客戶端收到的href屬性是這樣寫的:"javascript:中國",是無法執行的。
服務器端腳本對客戶端腳本的影響 前面已經說過了,服務器端腳本在邏輯上是提前于客戶端腳本的執行的,因此這樣的代碼是可行的: <% Dim i For i=1 to 5 Response.Write "<script type=""text/javascript"">" _ & "alert('Hello World!" & i & "')</script>" Next %>