none
ClientScriptManager.RegisterStartupScript 的问题 RRS feed

  • 问题

  • 当我们要注册一个在页面启动的脚本时,我们会用ClientScriptManager.RegisterStartupScript 。

    但有时,我们希望,弹出脚本信息后,不显示页面内容。如果使用Response.Write,则可轻易做到。


    Response.Write("<script>alert('hi');window.locaton.href='http://www.microsoft.com'</script>");
    Response.End()

    但,使用ClientScriptManager.RegisterStartupScript 则无法做到,虽然能够做到同样的效果,但页面的内容还是显示了。因为没有Response.End()

    其实这两种输出脚本的方法有什么优缺点?ClientScriptManager.RegisterStartupScript 能否实现不显示页面内容,弹出信息后,直接跳转。

    比如

    <%@ 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)
      {
        // Define the name and type of the client scripts on the page.
        String csname1 = "PopupScript";
        String csname2 = "ButtonClickScript";
        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))
        {
          String cstext1 = "alert('Hello World');window.locatoin.href='http://www.microsoft.com'";
          cs.RegisterStartupScript(cstype, csname1, cstext1, true);
        }

        // Check to see if the client script is already registered.
        if (!cs.IsClientScriptBlockRegistered(cstype, 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>");
          cs.RegisterClientScriptBlock(cstype, csname2, cstext2.ToString(), false);
        }
      }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml" >
      <head>
        <title>ClientScriptManager Example</title>
      </head>
      <body>
         <form id="Form1"
             runat="server">
            <input type="text" id="Message" /> <input type="button" value="ClickMe" onclick="DoClick()" />
         </form>
      </body>
    </html>

    执行此程序,会弹出信息,并且跳转,但弹出信息时,会显示页面的按钮。使用ClientScriptManager.RegisterStartupScript 能否实现,不显示页面内容,弹出信息,然后直接跳转?

    2010年9月8日 13:14

答案

  • RegisterStartupScript 就是页面显示出来再执行的,当然是要先显示页面,既然那样,为啥不直接使用Response.Write
    【孟子E章】
    2010年9月9日 1:43
    版主
  • HTML执行过程:

    浏览器发送请求->服务器接收->服务器处理->服务器返回请求->浏览器 开始接收返回数据

    ->浏览器一边接收一边把HTML转换成可以看见的文字啊,图片啊按钮啊什么的->接收完成->浏览器渲染HTML完成

    ->浏览器开始解释并执行页面上的Script脚本->触发window.onload,body.onload等事件。

    可见,用ClientScriptManager.RegisterStartupScript 方式,会返回整个页面的较大的Source,在浏览器接收服务器返回的HTML完成之前,不会执行Script,但却会Render页面,所以我们看到了页面。

    Response.Write("<script>alert('hi');window.locaton.href='http://www.microsoft.com'</script>");

    Response.End()

    这种方式,关键就是Response.End(),这句话告诉服务器,你剩下的网页不要发了,就那一句就够了,结果浏览器没收到后虽然做了Render,却因为没有相关的显示标签,所以貌似是空白页面,然后就执行了Script,跳转了。再者这个过程中,返回的长度也非常短,所以Render的速度也快,就更看不出来了。

    2010年9月11日 7:27

全部回复

  • RegisterStartupScript 就是页面显示出来再执行的,当然是要先显示页面,既然那样,为啥不直接使用Response.Write
    【孟子E章】
    2010年9月9日 1:43
    版主
  • ClientScriptManager.RegisterStartupScript 把脚本注册在页面最下面了 当然页面显示后执行的

    RegisterClientScriptBlock可以现实你想要的  它是把脚本注册在最上面


    77138191qq群 .net与asp.net
    2010年9月10日 14:33
  • HTML执行过程:

    浏览器发送请求->服务器接收->服务器处理->服务器返回请求->浏览器 开始接收返回数据

    ->浏览器一边接收一边把HTML转换成可以看见的文字啊,图片啊按钮啊什么的->接收完成->浏览器渲染HTML完成

    ->浏览器开始解释并执行页面上的Script脚本->触发window.onload,body.onload等事件。

    可见,用ClientScriptManager.RegisterStartupScript 方式,会返回整个页面的较大的Source,在浏览器接收服务器返回的HTML完成之前,不会执行Script,但却会Render页面,所以我们看到了页面。

    Response.Write("<script>alert('hi');window.locaton.href='http://www.microsoft.com'</script>");

    Response.End()

    这种方式,关键就是Response.End(),这句话告诉服务器,你剩下的网页不要发了,就那一句就够了,结果浏览器没收到后虽然做了Render,却因为没有相关的显示标签,所以貌似是空白页面,然后就执行了Script,跳转了。再者这个过程中,返回的长度也非常短,所以Render的速度也快,就更看不出来了。

    2010年9月11日 7:27
  • 经常会遇到.net注册js脚本问题

    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。

    RegisterClientScriptBlock一般返回的是客户端函数的包装,而RegisterStartupScript返回得函数在document装载完成后会执行,类似于我们平时所说的body onload="f()"里面的函数;这两个方法在客户端呈现的代码位置不同,RegisterClientScriptBlock在<form runat=server>之后,而RegisterStartupScript在</form>之前。

    补充例子:
    ....
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form name="Form1" method="post" action="WebForm6.aspx" id="Form1">
               <input type="hidden" name="__VIEWSTATE" value="dDw3MzU1MTQ5MzY7Oz6nugrEg+5T6RC7MTIuLoIrMLQLPw==" />
    <script>function block(){}</script>    ------------>RegisterClientScriptBlock()方法输出的在这里


    <input name="TextBox1" type="text" id="TextBox1" style="Z-INDEX: 101; LEFT: 296px; POSITION: absolute; TOP: 120px" />

                <script>function startup(){}</script> ------------>RegisterStartupScript()方法输出的在这里

    </form>
    </body>
    </HTML>

    Page.Register......为1.1下的写法,使用时提示"已过时"

    Page.ClientScript.Register......为2.0下的用法

     

    2010年9月11日 13:03