在 .aspx.cs页面中,输入这四个东西:Page.ClientScript、ClientScript、ScriptManager、ClientScriptManager,均会出提示,表示它们均可用,那么它们有什么区别呢?
Page.ClientScript 与 ClientScript 的关系
这二者实际上是一个东西,后者只是省略了 Page。都是获取用于管理脚本、注册脚本和向页添加脚本的ClientScriptManager 对象。
ScriptManager 与 ClientScriptManager 区别
他们的名称空间均是 System.Web.UI。
- ScriptManager 是用于管理 AJAX 脚本库和脚本文件;
- ClientScriptManager 用于管理普通的 script,就比如向客户端输出一个<script>alert("");</script>。
ClientScript 与 ClientScriptManager 区别
ClientScript 是 ClientScriptManager 的对象,ClientScriptManager是类。
Page.RegisterClientScriptBlock 与Page.RegisterStartupScript(也可省略 Page)
微软已经不推荐这样写,而应该是 ClientScript.RegisterClientScriptBlock 或
ClientScript.RegisterStartupScript。
RegisterClientScriptBlock、RegisterStartupScript 都是注册一个脚本块。
ClientScript.RegisterStartupScript(this.GetType(), "script1","alert(2);", true);
它们的区别就是 RegisterClientScriptBlock 是注册在 body 最前面,而RegisterStartupScript 是注册在 body 最后面。
为什么这样呢?一些优化性能的文章说,script 要放在 body 最后加载,但根据一些应用的实际情况,必须得在最初加载script,这时就得用 RegisterClientScriptBlock 了。
说说他们的第二个参数 key。
第二个参数 key 是用来避免重复注册的,上面代码,他们的 key 都是script1,但不会冲突,因为方法名称都不相同。
下面代码都是 RegisterStartupScript,第二句就不会有任何输出,因为之前已经注册过一个 script1的脚本了。
ClientScript.RegisterStartupScript(this.GetType(), "script1","alert(3);", true);
ClientScript.RegisterStartupScript(this.GetType(), "script2","alert(4);", true);
虽然,Response.Write 可以输出 JavaScript,但输出的内容是在<html>之前,这会导致一些问题,比如样式表失效,甚至会导致一些脆弱的浏览器发生错误。
ClientScript 则可以方便地管理 JavaScript,应该说ClientScript.RegisterClientScriptBlock 与ClientScript.RegisterStartupScript 只有一点区别,那就是RegisterClientScriptBlock 将脚本代码写在<form> 之后,而 RegisterStartupScript将代码写在 </form>(注意是结束标签)之前。
public void RegisterClientScriptBlock(Type type, string key, stringscript, bool addScriptTags)
public void RegisterStartupScript(Type type, string key, stringscript)
public void RegisterStartupScript(Type type, string key, stringscript, bool addScriptTags)
可以看出二者语法相同。
- type 要注册的启动脚本的类型。
- key 要注册的启动脚本的键,也就是你自己给这段脚本起的名字。相同 key的脚本被当作是重复的,对于这样的脚本只输出最先注册的,ClientScriptBlock 和 StartupScript 中的 key相同不算是重复的。
- script 脚本代码。
- addScriptTags 是否添加<script> 标签,如果脚本代码中不含<script> 标签,则应该指定该值为 true,若不指定该值,会被当作false 对待。
ClientScript.RegisterStartupScript(this.GetType(), "key1", "Go();",true);