IsStartupScriptRegistered为true时,RegisterStartupScript如何重复调用?
关于RegisterStartupScript重复触发的疑问
我正在参考MSDN上的RegisterStartupScript文档,但有个疑惑:我想在GridView行被点击时调用某个函数,且支持多次点击,于是写了如下代码,但不确定再次点击GridView行时,IsStartupScriptRegistered("JSScript")会不会变为true,导致RegisterStartupScript再也不执行?
Page_Load示例代码
public void Page_Load(Object sender, EventArgs e) { // Define the name and type of the client scripts on the page. String csname1 = "PopupScript"; Type cstype = this.GetType(); // Get a ClientScriptManager reference from the Page class. ClientScriptManager cs = Page.ClientScript; // Check to see if the startup script is already registered. if (!cs.IsStartupScriptRegistered(cstype, csname1)) { StringBuilder cstext1 = new StringBuilder(); cstext1.Append("<script type=text/javascript> alert('Hello World!') </"); cstext1.Append("script>"); cs.RegisterStartupScript(cstype, csname1, cstext1.ToString()); } }
GridView行点击事件代码
protected void gridview_RowClick(object sender, EventArgs e) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("<script language='javascript'>function ChangeColor() {"); sb.Append("var lbl = document.getElementById('lblDisplayDate');"); sb.Append("lbl.style.color='green';"); sb.Append("}</script>"); //Render the function definition. if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock")) { ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock", sb.ToString()); } //Render the function invocation. string funcCall = "<script language='javascript'>ChangeColor();</script>"; if (!ClientScript.IsStartupScriptRegistered("JSScript")) { ClientScript.RegisterStartupScript(this.GetType(), "JSScript", funcCall); } }
解答
你的担忧是错误的——每次GridView行点击触发回发时,都会创建一个全新的页面实例,ClientScriptManager的注册状态会被完全重置,所以每次进入gridview_RowClick事件时,IsStartupScriptRegistered("JSScript")都会返回false,你写的判断会让RegisterStartupScript每次点击都执行,回发后页面加载时都会调用ChangeColor()。
不过你的代码有个小问题:IsClientScriptBlockRegistered("JSScriptBlock")同样是基于当前页面生命周期的临时状态,每次回发初始都是false,所以每次点击都会重复注册ChangeColor函数的定义(虽然浏览器会覆盖重复的函数定义,不影响功能,但属于冗余代码)。
如果想避免重复注册函数定义,有两种更合理的写法:
- 把函数定义放到
Page_Load里注册(只在页面首次加载或每次回发时注册一次,用IsClientScriptBlockRegistered判断); - 直接把函数写在页面的
<script>标签里,不用后台注册,只在后台注册调用语句。
另外,注意RegisterStartupScript的注册语句会在页面DOM加载完成后执行,所以不用担心找不到lblDisplayDate元素的问题。
内容的提问来源于stack exchange,提问作者jp2code
相关产品推荐
相关产品推荐

