ASP.NET in C#,ClientScript.RegisterStartupScript與ClientScript.RegisterClientScriptBlock用法之己見


ClientScript.RegisterStartupScript:
http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscriptmanager.registerstartupscript(v=vs.80)
ClientScript.RegisterClientScriptBlock:
http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscriptmanager.registerclientscriptblock(v=vs.80).aspx
ASP.NET中,可以使用這兩個方法從后台向前台注冊JavaScript腳本;
這兩個方法,各自都有兩個重載的版本,個人推薦始終使用四個參數的版本,本文基於四個參數的版本:
public void RegisterStartupScript(Type type, string key, string script, bool addScriptTags);
public void RegisterClientScriptBlock(Type type, string key, string script, bool addScriptTags);
如果addScriptTags==true,那么script會被包含在<script></script>元素塊中;
如果addScriptTags==false,此時這兩個方法相當於三個參數的版本,<script></script>元素塊需自己寫;
另外,如果想通過注冊腳本的方式,在頁面上輸出html元素(如<h1>標題</h1>),可以把addScriptTags設置為false,在script中寫html元素,例如:
ClientScript.RegisterClientScriptBlock(Page.GetType(), "write", "<h1>標題一</h1>", false);
當然了,不推薦這種做法了,因為太不靈活了,RegisterClientScriptBlock寫的html元素只能在頁面的頂部,RegisterStartupScript寫的html元素只能在頁面的底部;比較靈活的做法是,使用JavaScript操作DOM元素。
好了,來說說RegisterClientScriptBlock和RegisterStartupScript的不同點吧:

1. RegisterClientScriptBlock注冊的腳本在<form>元素的后面,而RegisterStartupScript注冊的腳本在</form>元素的前面:
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ClientScript.RegisterClientScriptBlock(Page.GetType(), "", "alert('RegisterClientScriptBlock');", true);
        ClientScript.RegisterStartupScript(Page.GetType(), "", "alert('RegisterStartupScript');", true);
    }
}
生成的html:
<form method="post" action="Default.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZFL5WzOc4Lk3midVVH7bOliUF/+AQZAXgy6DDne32SJ1" />
</div>
 
<script type="text/javascript"> 
//<![CDATA[
alert('RegisterClientScriptBlock');//]]>
</script>
 
    <div>
    </div>
 
<script type="text/javascript"> 
//<![CDATA[
alert('RegisterStartupScript');//]]>
</script>
</form>
生成的html源代碼清楚的展現了注冊的腳本在頁面上的位置;
說明:生成的html源代碼中,緊跟在<form>后,在RegisterClientScriptBlock注冊的腳本前的內容(可能還有其他的),是ASP.NET為了實現自身功能所必須的由系統自動生成的,如果撇開這些內容,可以認為RegisterClientScriptBlock生成的腳本是緊跟在<form>元素后的。

2. 因為RegisterClientScriptBlock與RegisterStartupScript注冊的腳本的位置不同,導致兩者使用的場合也有所不同:
1> RegisterClientScriptBlock注冊的腳本是在DOM元素未完全加載前執行的,這就導致了,它無法訪問頁面中幾乎所有的html元素;所以RegisterClientScriptBlock適合寫JavaScript函數、警告(在用戶點擊“確定”之前,頁面為空白);
2> RegisterStartupScript注冊的腳本也是在DOM元素未完全加載前執行的,可是與RegisterClientScriptBlock不同的是,頁面上的大部分DOM元素它都可以訪問;所以RegisterStartupScript不太適合寫JavaScript函數,可能調用它寫的函數的時候,函數還沒加載到頁面上呢;
RegisterStartupScript也可以用來寫警告,此時,即使用戶沒有點擊“確定”按鈕,也可以看到頁面的內容;
※ 關於RegisterStartupScript寫的警告(alert),如果</form>后面有JavaScript腳本(直接硬編碼在頁面上的),且此腳本是控制頁面呈現樣式的,那么在用戶點擊警告框中的“確定”按鈕前,頁面的呈現可能會非預期;

3. 如果注冊的腳本的執行依賴於頁面上的元素,或為了顯示出預期的效果(上面提到的用戶未點擊“確定”按鈕,頁面呈現非預期),可以結合window.onload事件,如果使用了JQuery,可以把腳本包含在:
$(document).ready(function() {
// 這里
});

4. 最后說一下RegisterStartupScript和RegisterClientScriptBlock函數的第二個參數key吧:
在頁面加載或處理請求的過程中,執行了若干次RegisterStartupScript和RegisterClientScriptBlock方法,如果沒有給該函數指定key,即key="",或key重復,因為相同key的腳本只會注冊一次,重復注冊的腳本會被忽略,如果出現了某些腳本未注冊的情況,此時就需要檢查是否出現了重復的key;RegisterStartupScript和RegisterClientScriptBlock的key可以重復,因為是不同的方法嘛!~
可以通過:
public bool IsStartupScriptRegistered(Type type, string key);
public bool IsClientScriptBlockRegistered(Type type, string key);
來檢查是否注冊了相應key的腳本,避免重復注冊:
ClientScript.RegisterStartupScript(Page.GetType(), "alert", "alert('RegisterStartupScript');", true);
if (!ClientScript.IsStartupScriptRegistered(Page.GetType(), "alert"))
{
    ClientScript.RegisterStartupScript(Page.GetType(), "alert", "alert('RegisterStartupScript_2');", true);
}
上面的示例只是為了講解IsStartupScriptRegistered的用法,實際使用中,沒有誰會寫這么小白的用法!~
如果可以保證在頁面加載或處理請求的過程中,只會調用一次RegisterStartupScript和RegisterClientScriptBlock方法,可以不指定key;
例如,處理表單數據,某個字段不符合要求時,提示:
if (string.IsNullOrEmpty(txtInput.Value.Trim()))
{
    ClientScript.RegisterStartupScript(Page.GetType(), "", "alert('不可以為空!');", true);
    return;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM