官术网_书友最值得收藏!

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

true

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

表3-3

true

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

true

圖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及運行的途徑!

主站蜘蛛池模板: 达尔| 长寿区| 东阳市| 巴里| 凌源市| 烟台市| 门源| 贺兰县| 鄱阳县| 云龙县| 兴化市| 定陶县| 稻城县| 明星| 调兵山市| 潜山县| 洛南县| 深泽县| 海淀区| 锡林浩特市| 杭州市| 海林市| 枣阳市| 大姚县| 永福县| 佛坪县| 辽宁省| 敦煌市| 榆社县| 高阳县| 武定县| 濮阳市| 湟中县| 凤冈县| 兴国县| 桐城市| 昌邑市| 武乡县| 车险| 水城县| 宣威市|