RegisterClientScriptBlock 与 RegisterStartupScript 的区别

RegisterClientScriptBlock、RegisterStartupScript 都是注册一个脚本块。

ClientScript.RegisterClientScriptBlock(this.GetType(), "script1", "alert(1);", true);

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(2);", true);

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, string script)

public void RegisterClientScriptBlock(Type type, string key, string script, bool addScriptTags)

public void RegisterStartupScript(Type type, string key, string script)

public void RegisterStartupScript(Type type, string key, string script, bool addScriptTags)

可以看出二者语法相同。
type 要注册的启动脚本的类型。
key 要注册的启动脚本的键,也就是你自己给这段脚本起的名字。相同 key 的脚本被当作是重复的,对于这样的脚本只输出最先注册的,ClientScriptBlock 和 StartupScript 中的 key 相同不算是重复的。
script 脚本代码。
addScriptTags 是否添加 <script> 标签,如果脚本代码中不含 <script> 标签,则应该指定该值为 true,若不指定该值,会被当作 false 对待。

ClientScript.RegisterClientScriptBlock(this.GetType(), "key1", @"function Go(){alert('');}", true);

ClientScript.RegisterStartupScript(this.GetType(), "key1", "Go();", true);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
RegisterStartupScript(key, script)
RegisterClientScriptBlock(key, script)

这两个方法的作用都是从前台向后台写脚本,且都接受两个相同的参数:
第一个参数 key 是插入的客户端脚本的唯一标识符。
第二个参数 script 是要插入到页面中的客户端脚本内容,包括 <script> 的起始标记和终止标记</script>。

这两个方法唯一的不同之处在于向“何处”注册脚本块。
RegisterClientScriptBlock(key, script) 在 form开始处(紧接 <form runat="server"> 标识之后)发送脚本块
使用场景:
一般不使用DOM元素
RegisterStartupScript(key, script) 在 form结尾处(在 </form> 标识之前)发送脚本块,在document装载完成后会执行,等价于body.onload=f(){}里的内容
使用场景:
一般要使用DOM元素,比如:修改dom元素的值等
——————————————————————————————————————————————————————————————————————

Page.ClientScript.RegisterClientScriptBlock & Page.ClientScript.RegisterStartupScript

//RegisterClientScriptBlock方法可以把JavaScript函数放在页面的顶部。也就是说,该脚本用于在浏览器中启动页面。

<%@ Page Language="C#" %>



<script runat="server">

protected void Page_Load(object sender,EventArgs e)

{

    string myScript = @"function AlertHello() { alert('Hello ASP.NET'); }";

    Page.ClientScript.RegisterClientScriptBlock(this.GetType(),"MyScript",myScript,true);

}

</script>

在这个例子中,把JavaScript函数AlertHello()创建为一个字符串myScript。然后使用Page. ClientScript.RegisterClientScriptBlock方法编写放在页面上的脚本。RegisterClientScriptBlock方法的两个构建方式如下:
● RegisterClientScriptBlock (type,key,script)
● RegisterClientScriptBlock (type,key,script,script tag specification)

4.4.2 使用Page.ClientScript.RegisterStartupScript
RegisterStartupScript方法与RegisterClientScriptBlock方法的区别不大。最大的区别是RegisterStartupScript把脚本放在ASP.NET页面的底部,而不是顶部。实际上,RegisterStartup Script方法甚至使用与RegisterClientScriptBlock方法相同的构造函数:
● RegisterStartupScript (type,key,script)
● RegisterStartupScript (type,key,script,script tag specification)
那么,在页面上注册脚本的过程有什么区别?实际上区别很大!
如果在页面上有一些处理控件的JavaScript,在大多数情况下应使用RegisterStartupScript方法,而不是RegisterClientScriptBlock方法。
就是,查找、调用页面控件的时候,就使用 Page.ClientScript.RegisterStartupScript

4.4.3使用Page.ClientScript.RegisterClientScriptInclude
最后一个方法是RegisterClientScriptInclude。许多开发人员都把JavaScript放在.js文件中,这是最好的方式,因为很容易把对JavaScript的修改应用于整个应用程序。使用RegisterClientScriptInclude方法可以在ASP.NET页面上注册脚本文件,如下所示。
string myScript = "myJavaScriptCode.js"
Page.ClientScript.RegisterClientScriptInclude("myKey",myScript);

____________________________________________________________________________________________________________________

From MSDN:



<%@ Page Language="C#"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  public void Page_Load(Object sender, EventArgs e)

  {

    String csname1 = "PopupScript";

    String csname2 = "ButtonClickScript";



    if (!IsClientScriptBlockRegistered(csname1))

    {

        String cstext1 = "<script type=\"text/javascript\">" +

            "alert('Hello World');</" + "script>";

        RegisterStartupScript(csname1, cstext1); //未使用了DOM元素,和上面说法相矛盾



    }



    if (!IsClientScriptBlockRegistered(csname2))

    {

      StringBuilder cstext2 = new StringBuilder();

      cstext2.Append("<script type=\"text/javascript\"> function DoClick() {");

      cstext2.Append("Form1.Message.value='Text from client script.'} </");

      cstext2.Append("script>");

      RegisterClientScriptBlock(csname2, cstext2.ToString()); //使用DOM元素

    }

  }

</script>

<html  >

  <head>

    <title>RegisterClientScriptBlock Example</title>

  </head>

  <body>

     <form id="Form1"

         runat="server">

        <input type="text" id="Message" /> <input type="button" value="ClickMe" onclick="DoClick()" />

     </form>

  </body>

</html>

/////////////////////////////////////////////////////////////////////////////////////////////////////////
RegisterClientScriptBlock、RegisterStartupScript 都是注册一个脚本块。

ClientScript.RegisterClientScriptBlock(this.GetType(), "script1", "alert(1);", true);

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(2);", true);

ClientScript.RegisterStartupScript(this.GetType(), "script1", "alert(3);", true);

ClientScript.RegisterStartupScript(this.GetType(), "script2", "alert(4);", true);

RegisterClientScriptBlock 与 RegisterStartupScript 详细用法

虽然,Response.Write 可以输出 JavaScript,但输出的内容是在 <html> 之前,这会导致一些问题,比如样式表失效,甚至会导致一些脆弱的浏览器发生错误。

ClientScript 则可以方便地管理 JavaScript,应该说 ClientScript.RegisterClientScriptBlock 与 ClientScript.RegisterStartupScript 只有一点区别,那就是 RegisterClientScriptBlock 将脚本代码写在 <form> 之后,而 RegisterStartupScript 将代码写在 </form>(注意是结束标签)之前。

public void RegisterClientScriptBlock(Type type, string key, string script)

public void RegisterClientScriptBlock(Type type, string key, string script, bool addScriptTags)

public void RegisterStartupScript(Type type, string key, string script)

public void RegisterStartupScript(Type type, string key, string script, bool addScriptTags)

可以看出二者语法相同。

type 要注册的启动脚本的类型。
key 要注册的启动脚本的键,也就是你自己给这段脚本起的名字。相同 key 的脚本被当作是重复的,对于这样的脚本只输出最先注册的,ClientScriptBlock 和 StartupScript 中的 key 相同不算是重复的。
script 脚本代码。
addScriptTags 是否添加 <script> 标签,如果脚本代码中不含 <script> 标签,则应该指定该值为 true,若不指定该值,会被当作 false 对待。

ClientScript.RegisterClientScriptBlock(this.GetType(), "key1", @"function Go(){alert('');}", true);

ClientScript.RegisterStartupScript(this.GetType(), "key1", "Go();", true);

这两个方法,均可传入参数,参数表示 JavaScript 代码,然后向客户端输入这个 JavaScript 代码。

那么 alert("第一行\r\n第二行"); 这段 JavaScript 代码为什么会出错呢?

原来,这里的 JavaScript 代码进入之后,会把 \r\n 解释为换行,比如 var i = 0;\r\nvar j = 0; 这段代码输出到客户端后会变成两行。

所以要在 alert 中换行,应该这样:

alert("第一行\\r\\n第二行");//加上转义字符。

RegisterClientScriptBlock  和  RegisterStartupScript  输出位置的区别

Page.Response.Write("<script>var response;</script>");

Page.RegisterStartupScript("RegisterStartupScript","<script>var RegisterStartupScript;</script>");

Page.RegisterClientScriptBlock("RegisterClientScriptBlock","<script>var RegisterClientScriptBlock;</script>");

Response.Write 输出后的位置在源文件的第一行。
RegisterClientScriptBlock 输出后的位置会在 <form> 的下一行(在 ASP.NET 自带的脚本和一些隐藏域之下)。
RegisterStartupScript 输出后的位置会在 </form> 的上一行。
RegisterClientScriptBlock 的原型与 RegisterStartupScript 相同,两个函数不同在于将其包含的脚本代码写入到 HTML 文件的不同位置。RegisterClientScriptBlock 在 Page 对象的元素的开始标记后立即发出客户端脚本,RegisterStartupScript 则是在 Page 对象的元素的结束标记之前发出该脚本。如果你的脚本有与页面对象(Doucument 对象)进行交互的语句,则推荐使用 RegisterStartupScript,反之如果要想客户端脚本尽可能早的执行
,则可以使用 RegisterClientScriptBlock 或 Response.Write(不推荐用 Response.Write 输出脚本,它破坏了网页的结构。千一网络编辑注)。
RegisterClientScriptBlock 一般返回的是客户端函数的包装,而 RegisterStartupScript 返回得函数在 Document 装载完成后会执行,类似于我们平时所说的 <body onload="f()"> 里面的函数;这两个方法在客户端呈现的代码位置不同,RegisterClientScriptBlock 在 <form runat=server> 之后,而 RegisterStartupScript 在 </form> 之前。

你可能感兴趣的:(startup)