这是一个旧的讨论线程,在其中我列出了主要区别以及应使用每种方法的条件。我认为您可能会觉得进行讨论很有用。
要解释与您发布的示例相关的差异:
一个。使用时
RegisterStartupscript,它将在页面中的所有元素 之后
(紧靠表单的end标签之前)呈现脚本。这使脚本可以调用或引用页面元素,而不会在页面的DOM中找不到它们。
这是调用该
RegisterStartupscript方法时页面的呈现源:
<html xmlns="http://www.w3.org/1999/xhtml"><head id="Head1"><title></title></head><body> <form name="form1" method="post" action="Startupscript.aspx" id="form1"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="someViewstategibberish" /> </div> <div> <span id="lblDisplayDate">Label</span> <br /> <input type="submit" name="btnPostback" value="Register Startup script" id="btnPostback" /> <br /> <input type="submit" name="btnPostBack2" value="Register" id="btnPostBack2" /> </div> <div> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="someViewstategibberish" /> </div> <!-- Note this part --> <script language='javascript'> var lbl = document.getElementById('lblDisplayDate'); lbl.style.color = 'red'; </script> </form> <!-- Note this part --></body></html>b。使用时
RegisterClientscriptBlock,脚本将在Viewstate标记之后但在任何页面元素之前呈现。由于这是一个直接脚本(不是可以
调用 的函数,因此它将被浏览器立即执行。但是在此阶段,浏览器无法在Page DOM中找到标签,因此您应该收到“找不到对象”错误。
这是调用该
RegisterClientscriptBlock方法时页面的呈现源:
<html xmlns="http://www.w3.org/1999/xhtml"><head id="Head1"><title></title></head><body> <form name="form1" method="post" action="Startupscript.aspx" id="form1"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="someViewstategibberish" /> </div> <script language='javascript'> var lbl = document.getElementById('lblDisplayDate'); // Error is thrown in the next line because lbl is null. lbl.style.color = 'green';因此,总而言之,如果要呈现函数定义,则应调用后一种方法。然后,您可以使用前一种方法(或添加客户端属性) 来 呈现 对该函数 的 调用 。
评论后编辑:
例如,以下功能将起作用:
protected void btnPostBack2_Click(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); } }


