ASP.NET服務器控件發送腳本(2)
發表于:2007-06-30來源:作者:點擊數:
標簽:
使用 ReGISterStartupScript() 和 RegisterClientScriptBlock() 添加客戶端腳本塊 System.Web.UI.Page 類包含的兩個方法可以將客戶端腳本代碼發送到由 ASP.net Web 頁面提供的 HTML 中: RegisterStartupScript(key, script) RegisterClientScriptBlock(key,
使用 ReGISterStartupScript() 和 RegisterClientScriptBlock() 添加客戶端腳本塊
System.Web.UI.Page 類包含的兩個方法可以將客戶端腳本代碼發送到由 ASP.net Web 頁面提供的 HTML 中:
RegisterStartupScript(key, script)
RegisterClientScriptBlock(key, script)
這兩個方法都接受兩個字符串作為輸入。第二個參數 script 是要插入到頁面中的客戶端腳本,包括 <script> 的起始標記和終止標記。第一個參數 key 是插入的客戶端腳本的唯一標識符。
這兩個方法唯一的不同之處在于從“何處”發送腳本塊。RegisterClientScriptBlock() 在 Web 窗體的開始處(緊接著 <form runat="server"> 標識之后)發送腳本塊,而 RegisterStartupScript() 在 Web 窗體的結尾處(在 </form> 標識之前)發送腳本塊。
為什么會有兩種不同的方法來發送客戶端腳本?要更好地了解這一點,我們必須首先了解,客戶端腳本可以分為兩類:一類是在加載頁面后立即運行的代碼,一類是在發生某些客戶端事件時才運行的代碼。前者的常見示例是將焦點設置到文本框的客戶端代碼。例如,當您訪問 Google 時,在頁面加載后就會執行一小段客戶端代碼,以自動將焦點設置到搜索文本框。
以下是后一類代碼(為響應客戶端事件而運行的代碼)的示例。具體而言,在該示例中,單擊按鈕時將顯示一個彈出式對話框:
<html>
<body>
<form>
<script language="
JavaScript">
<!--
function displayPopup() {
alert("Hello, world.");
}
// -->
</script>
<input type="button" value="Click Me!" onclick="displayPopup()" />
</form>
</body>
</html>
在這段代碼中,<input> 標記中的 onclick="displayPopup()" 用于指明在單擊按鈕時,JavaScript 函數 displayPopup() 應該運行。
RegisterStartupScript() 方法可用于添加要在加載頁面后運行的腳本塊。通過這種方法添加的腳本塊位于 Web 窗體的結尾處,因為必須在腳本運行前定義腳本要修改的 HTML 元素。也就是說,如果您要使用客戶端腳本將焦點設置到文本框,必須確保文本框的 HTML 標記位于設置該文本框的焦點的腳本之前。例如,下面的 HTML 將顯示一個文本框,并將焦點設置到該文本框:
<input type="text" id="myTextBox" />
<script language="JavaScript">
<!--
document.getElementById("myTextBox").focus();
// -->
</script>
相反,以下 HTML 不會將焦點設置到文本框,因為文本框是在腳本塊“之后”定義的:
<script language="JavaScript">
<!--
document.getElementById("myTextBox").focus();
// -->
</script>
<input type="text" id="myTextBox" />
因此,RegisterStartupScript() 方法將 <script> 塊置于 Web 窗體的結尾處,以保證在執行客戶端腳本之前已聲明 Web 窗體中的所有 HTML 元素。
RegisterClientScriptBlock() 方法用于為響應客戶端事件而執行的腳本代碼。通過此方法發送的腳本塊位于 Web 頁面的開始處,因為這種方法不要求將腳本塊置于所有 HTML 元素之后。
探討IsStartupScriptRegistered() 和 IsClientScriptBlockRegistered()
除RegisterStartupScript() 和 RegisterClientScriptBlock() 方法之外,Page 類還包含兩個在發送客戶端腳本時常用的輔助方法:
IsStartupScriptRegistered(key)
IsClientScriptBlockRegistered(key)
如上所述,在使用 RegisterStartupScript() 或 RegisterClientScriptBlock() 插入客戶端腳本塊時,提供了一個唯一標識腳本塊的關鍵字。這兩個方法都接受一個輸入(字符串 key),并返回一個布爾值,以指示帶有指定關鍵字的腳本塊是否已添加到頁面中。具體地說,如果帶有特定 key 的腳本塊已經注冊,這些方法將返回 True,否則將返回 False。
要了解如何使用這兩個方法,可以看一看 ASP.NET 驗證 Web 控件,如 RequiredFieldValidator、RegularExpressionValidator 等等。這些控件都會用到一個常用的驗證 JavaScript 文件 (WebValidation.js),該文件位于 ASP.NET Web 應用程序的 aspnet_client/system_web/版本號 目錄中。因此,所有這些控件都會發送相同的腳本塊,這個腳本塊將調用在 WebValidation.js 文件中定義的相應的 JavaScript 函數,以啟動客戶端的驗證過程。要完成這個過程,這些控件會使用 Page 類的 RegisterClientScriptBlock() 方法,并使用關鍵字 ValidatorIncludeScript。
接下來要考慮的是,如果一個 ASP.NET Web 頁面中包含多個驗證 Web 控件,會出現什么情況呢?所有這些 Web 控件都要使用相同的關鍵字發送相同的腳本塊。如果使用這個關鍵字調用兩次 RegisterClientScriptBlock() 或 RegisterStartupScript() 方法,則第二次調用會被認為是復制腳本塊而被忽略。因此,即使一個 Web 頁面上有多個驗證控件,也只是發送一個公共腳本塊的實例。但是,請注意,除第一個控件之外的其他所有驗證 Web 控件都會構建要發送的公共客戶端腳本,而這只是在浪費時間。
這時就應該使用 IsClientScriptBlock() 和 IsStartupScript() 方法。這樣一來,驗證 Web 控件就不會先花時間構建要發送的客戶端代碼,而是先檢查是否已經存在使用關鍵字 ValidatorIncludeScript 注冊的腳本。如果存在,控件就會放棄構建客戶端腳本塊,因為腳本塊已經由頁面上的其他驗證控件構建了。
因此,每次構建客戶端腳本時,應該首先調用 IsClientScriptBlock() 或 IsStartupScript() 方法,以確定是否需要生成客戶端腳本。在下面一節,我們將看到一些示例,在這些示例中,IsClientScriptBlock()、IsStartupScript() 方法先后與 RegisterClientScriptBlock() 和 RegisterStartupScript() 方法結合使用。
原文轉自:http://www.kjueaiud.com