- 決戰(zhàn).NET
- 黃忠成
- 705字
- 2018-12-27 16:55:59
3.10 另一種解法:RegisterClientScriptBlock函數(shù)
ScriptManager控件仿照Page的ClientScript屬性,提供了對應的函數(shù),可以由被加載者來決定繪制哪些Script。以第3.8 節(jié)的例子來說,設計師可在UserControl中調用ScriptManager. RegisterClientScriptBlock函數(shù)(為程序3-24所示)來刷新,同時繪制指定的JavaScript。
程序3-24
Samples\3\AjaxDemo1\DynamicLoadUserControl3.aspx.cs protected void Page_Load(object sender, EventArgs e) { ScriptManager.RegisterClientScriptBlock(this, GetType(),"ShowMessageScript", "function showMessage(str) { alert(str); }", true); }
除了RegisterClientScriptBlock函數(shù)外,ScriptManager幾乎實現(xiàn)了所有于Page的ClientScript屬性可調用的相關Script函數(shù),見表3-2。
表3-2

每個ScriptManager所提供的注冊JavaScript的同名函數(shù)都有兩個重載函數(shù),一個以Page對象作為第一個參數(shù),另一個則以Control對象作為第一個參數(shù),兩者的差別請見表3-3。
表3-3

一般來說,第二個以Page作為第一參數(shù)的函數(shù)是較常用的,以Control作為參數(shù)的函數(shù)多半只應用于撰寫控件時,兩類函數(shù)都會以第二個Type參數(shù)加上指定的鍵值(第三個參數(shù))作為判斷該JavaScript是否已經輸出的條件,當以同一Type、同一鍵值注冊時,將只會輸出第一次調用時所注冊的JavaScript程序代碼。程序3-25 是一個使用RegisterStartupScript函數(shù)注冊JavaScript程序代碼,在點擊按鈕產生Async-Postback后跳出一信息的例子,其運行結果如圖3-20所示。

圖3-20
程序3-25
.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" /> <div> <asp:UpdatePanel ID="UpdatePanel1" UpdateMode=conditional runat= "server"> <ContentTemplate> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html> .aspx.cs using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { ScriptManager.RegisterStartupScript(this, typeof(Page), "MyScript", "alert('Hello!!');", true); } }
不知讀者是否發(fā)現(xiàn),本節(jié)的例子在你點擊按鈕后,該UserControl會立即消失,這是因為Postback后,動態(tài)加載的控件必須重載一次,而此處尚未重載所致,第4章會詳細討論如何解決此問題。
動態(tài)加載的JavaScript
雖然動態(tài)輸出JavaScript相當好用,但聰明的你一定會很好奇,如果一直點擊按鈕,是不是會一直注冊這段JavaScript程序代碼到瀏覽器中運行呢?你的猜想是對的,瀏覽器只提供了動態(tài)加載JavaScript程序代碼的能力,但沒有提供釋放的機制,這意味著任何使用ScriptManager加載的JavaScript程序文件或程序代碼,都會一直存在于瀏覽器中。即使如此,使用ScriptManager處理JavaScript仍然是不可避免的,因為這是唯一可以在部分刷新情況下仍能動態(tài)輸出JavaScript及運行的途徑!
- Hands-On Deep Learning with Apache Spark
- 嵌入式系統(tǒng)及其開發(fā)應用
- Hands-On Internet of Things with MQTT
- 人工智能超越人類
- Hands-On Neural Networks with Keras
- 數(shù)據(jù)運營之路:掘金數(shù)據(jù)化時代
- 自動檢測與轉換技術
- 大數(shù)據(jù)安全與隱私保護
- CompTIA Linux+ Certification Guide
- 網絡化分布式系統(tǒng)預測控制
- Dreamweaver CS6精彩網頁制作與網站建設
- 重估:人工智能與賦能社會
- 一步步寫嵌入式操作系統(tǒng)
- 基于Proteus的PIC單片機C語言程序設計與仿真
- Flash CS5二維動畫設計與制作