使用 Response.Write 输出 JS 后会造成 CSS
样式失效,其主要原因是输出的 JS 被放到了页面的最前面,破坏了 XHTML
的结构。我们可以使用下面两种方法来输出 JS:void MessageBox(string strKey,string strInfo)
...{
if (!ClientScript.IsClientScriptBlockRegistered(strKey))
...{
string strjs = "alert('" + strInfo + "');";
ClientScript.RegisterStartupScript(this.GetType(), strKey, strjs, true);
}
}
或
void MessageBox(string strKey,string strInfo)
...{
if (!ClientScript.IsClientScriptBlockRegistered(strKey))
...{
string strjs = "alert('" + strInfo + "');";
ClientScript.RegisterClientScriptBlock(this.GetType(), strKey, strjs, true);
}
}
.NET1.1 中对应的方法为
Page.RegisterStartupScript 和
Page.RegisterClientScriptBlock。
这两个方法的作用都是从后台向前台写脚本,
这两个方法唯一的不同之处在于从“何处”发送脚本块。RegisterClientScriptBlock()
在 Web 窗体的开始处(紧接着<form runat="server">
标识之后)发送脚本块,而 RegisterStartupScript() 在 Web
窗体的结尾处(在 </form> 标识之前)发送脚本块。
RegisterStartupScript()
用于添加要在加载页面后运行的脚本块,通过这种方法添加的脚本块位于 Web
窗体的结尾处,因为必须在脚本运行前定义脚本要修改的 HTML
元素。也就是说,如果您要使用客户端脚本将焦点设置到文本框,必须确保文本框的
HTML
标记位于设置该文本框的焦点的脚本之前。脚本块包含<script></script>。
RegisterClientScriptBlock()
方法用于为响应客户端事件而执行的脚本代码。通过此方法发送的脚本块位于
Web 页面的开始处,因为这种方法不要求将脚本块置于所有 HTML
元素之后,即它一般不使用文档内自定义的控件。脚本块不包含<script></script>。
如果你仅仅是注册一些函数,这两者的效果是一样的。但如果你要注册一些全局的脚本,如定义一些全局变量并赋值,那么它在HTML中的先后位置可能就比较重要,此时就应该用RegisterStartupScript保证脚本能在前面被执行。