操作步驟: 給頁面隱藏TextBox賦值,然後觸發ASP.NET change事件,調用ASP.NET後臺方法,調用後執行客戶端腳本this.RegisterClientScriptBlock(DateTime.Now.ToString(), script); 執行頁面的script;頁面的scri ...
操作步驟:
給頁面隱藏TextBox賦值,然後觸發ASP.NET change事件,調用ASP.NET後臺方法,調用後執行客戶端腳本this.RegisterClientScriptBlock(DateTime.Now.ToString(), script);
執行頁面的script;頁面的script腳本再次給隱藏TextBox賦值,然後觸發ASP.NET change事件;此時沒有進入後臺的ASP.NET change事件
解決方案:
將this.RegisterClientScriptBlock(DateTime.Now.ToString(), script);更改為Page.RegisterStartupScript(DateTime.Now.ToString(), script);
分析原因:
Response.Write與RegisterStartupScript與RegisterClientScriptBlock之間的區別 方法1,使用Response.Write,這種方法會把JS代碼寫在頁面的最頂部(的前面): System.Web.HttpContext.Current.Response.Write(" 方法2,使用RegisterStartupScript,這種方法會把JS代碼嵌入在頁面的底部、表單的最後 (前面),適用於要在頁面控制項載入完成後運行的JS代碼 : System.Web.UI.Page page = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler; if (!page.ClientScript.IsStartupScriptRegistered(page.GetType(),"clientScript")) page.ClientScript.RegisterStartupScript(page.GetType(), "clientScript", " 方法3,使用RegisterClientScriptBlock,這種方法會把JS代碼嵌入在頁面的頂部、表單的最前 (後面),適用於要在控制項載入前執行的JS代碼,類似於上面的Response.Write方式 : System.Web.UI.Page page = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler; if (!page.ClientScript.IsClientScriptBlockRegistered(page.GetType(),"clientScript")) page.ClientScript.RegisterClientScriptBlock(page.GetType(), "clientScript", "
那麼,方法2和方法3之間有何不同呢?主要區別在於,RegisterStartupScript 方法是將 JavaScript 嵌入到 ASP.NET 頁面的底部,恰好位於關閉元素 的前面。
RegisterClientScriptBlock 方法是將 JavaScript 嵌入到頁面中開啟元素 的緊後面。那麼,這有何不同呢?正如我們將要看到的,這有很大的不同。 就此列舉一例,以下是在頁面載入到瀏覽器時,將焦點置於該頁面上的一個文本框中的方法
- 使用利用了RegisterStartupScript 方法的 Visual Basic: Page.ClientScript.RegisterStartupScript(Me.GetType(), "Testing", _ "document.forms[0]['TextBox1'].focus();", True) 由於在瀏覽器運行到頁面底部並執行此小段 JavaScript 時,就已生成了頁面上的文本框,並已將其放到了頁面中,因此,此方法運行正常。
但是,如果不按照上述方法,而編寫如下代碼(使用 RegisterClientScriptBlock 方法): Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "Testing", _ "document.forms[0]['TextBox1'].focus();", True) 文本框控制項將不會獲得焦點,且會在頁面上生成一個 JavaScript 錯誤 因為RegisterClientScriptBlock與RegisterStartupScript註冊的腳本的位置不同,導致兩者使用的場合也有所不同: 1> RegisterClientScriptBlock註冊的腳本是在DOM元素未完全載入前執行的,這就導致了,它無法訪問頁面中幾乎所有的html元素;
所以RegisterClientScriptBlock適合寫JavaScript函數、警告(在用戶點擊“確定”之前,頁面為空白); 2> RegisterStartupScript註冊的腳本也是在DOM元素未完全載入前執行的,可是與RegisterClientScriptBlock不同的是,頁面上的大部分DOM元素它都可以訪問;
所以RegisterStartupScript不太適合寫JavaScript函數,可能調用它寫的函數的時候,函數還沒載入到頁面上呢; RegisterStartupScript也可以用來寫警告,此時,即使用戶沒有點擊“確定”按鈕,也可以看到頁面的內容; 關於RegisterStartupScript寫的警告(alert),如果< / form >後面有JavaScript腳本(直接硬編碼在頁面上的),且此腳本是控制頁面呈現樣式的,那麼在用戶點擊警告框中的“確定”按鈕前,頁面的呈現可能會非預期; 處理表單數據,某個欄位不符合要求時,提示: if (string.IsNullOrEmpty(txtInput.Value.Trim())){ ClientScript.RegisterStartupScript(Page.GetType(), "", "alert('不可以為空!');", true); return;}