none
前台javascript用 RegisterClientScriptBlock 调用没效果 RRS feed

  • 问题

  • 我在page_load 里加入了
    if(IsPostBack)
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script language='javascript'>SetItemStatus('lock')</script>",true);


    javascript:

    function SetItemStatus(act)
    {
       if(act=="lock")
    {
       document.getElementById("<%=txt_code.ClientID%>").disabled = false;
    }

     return true;
    }

    在按钮的OnClientClick里有效,放在page_load就不行了,放在子页和母板里都一样不起作用,也没报错。
    2009年11月2日 10:43

答案

  • 给你一个模板页内容页相互访问的例子,你需要对模板页和内容页的机制和关系进行深入的了解。
    MasterPage3.master

    <%@ Master 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">
      protected void Page_Load(object sender, EventArgs e)
      {
        if (Page.IsPostBack)
        {
          String ChildPageTextBoxId = (this.ContentPlaceHolder1.FindControl("TextBox2") as TextBox).ClientID;
          Page.ClientScript.RegisterStartupScript(this.GetType(), "", "alert('OOXX from MasterPage');SetItemStatus('lock','" + ChildPageTextBoxId + "');", true);
        }
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    
      <script type="text/javascript">
        function SetItemStatus(act, controlId) {
          if (act == "lock") {
            document.getElementById(controlId).disabled = true;
          }
        }
      </script>
    
    </head>
    <body>
      <form id="form1" runat="server">
      <h1>
        模板页</h1>
      <div>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
      </div>
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
      </form>
    </body>
    </html>
    
    内容页:
    <%@ Page Language="C#" MasterPageFile="~/MasterPage3.master" %>
    <script runat="server">
      protected void Page_Load(object sender, EventArgs e)
      {
        if (Page.IsPostBack)
        {
          String MasterPageTextBoxID = (this.Master.FindControl("TextBox1") as TextBox).ClientID;
          Page.ClientScript.RegisterStartupScript(this.GetType(), "", "alert('OOXX from ContentPage');SetItemStatus('lock','" + this.TextBox1.ClientID + "');SetItemStatus('lock','" + MasterPageTextBoxID + "');", true);
        }
      }
    </script>
    <asp:Content ContentPlaceHolderID="ContentPlaceHolder1" ID="x" runat="server">
      <h2>
        内容页
      </h2>
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
      <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
      <asp:Button ID="Button1" runat="server" Text="Button" />
    </asp:Content>
    
    你全部拷贝去进行测试。注意:不要漏掉js里面的分号;

    【孟子E章】
    • 已标记为答案 scate233 2009年11月3日 6:16
    2009年11月3日 5:02
    版主

全部回复

  •   Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "a", "SetItemStatus('lock')",true);
    还有if(IsPostBack)是否写错了
    应该是if(!IsPostBack)

    2009年11月2日 12:04
  • Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script language='javascript'>SetItemStatus('lock')</script>",false);

    或者按照楼上 的方法

    最好使用 RegisterStartupScript方法
    【孟子E章】
    2009年11月2日 12:48
    版主
  • RegisterClientScriptBlock是把脚本注册到页面顶部,如果在页面上有一些处理控件的javascript.大多情况下还是使用RegisterStartupScript方法. 

    .Net Framework 1.0/1.1中都已经废除了Page.RegisterStartupScript和Page.RegisterClientScriptBlock
    2009年11月3日 1:20
  • 试了一下,还是没有效果,脚本调试到了Page_Load 那句但是没有进去那个javascript里面,上面两句RegisterClientScriptBlock都试过了都一样,
     if(IsPostBack) 是我要求在回发后锁掉一个控件。
    RegisterStartupScript 的话,那个javascript 函数要操作控件,并写在了子页aspx的最后那里,和这个好像对不上!?
    2009年11月3日 1:42
  • 你必须使用RegisterStartupScript 。在你调用的时候控件还没加载,所以你的js会报告错误
    【孟子E章】
    2009年11月3日 1:43
    版主
  • 另外,锁定是
    document.getElementById("<%=txt_code.ClientID%>").disabled = true;

    or

    document.getElementById("<%=txt_code.ClientID%>").disabled = "disabled";

    not false

    【孟子E章】
    2009年11月3日 1:45
    版主
  • 直接测试的代码

    <%@ 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"> 
      protected void Page_Load(object sender, EventArgs e)
      {
        if (IsPostBack)
          Page.ClientScript.RegisterStartupScript(this.GetType(), "", "SetItemStatus('lock')", true);
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    
      <script type="text/javascript">
    
        function SetItemStatus(act) {
          if (act == "lock") {
            document.getElementById("<%=txt_code.ClientID%>").disabled = true;
          }
        }
      </script>
    
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:TextBox ID="txt_code" runat="server"></asp:TextBox>
      <asp:Button ID="Button1" runat="server" Text="执行测试" />
      </form>
    </body>
    </html>
    


    【孟子E章】
    2009年11月3日 1:49
    版主
  • 修改如下:
    page_load 里
    if (IsPostBack)
                Page.ClientScript.RegisterStartupScript(this.GetType(), "","<script language='javascript'>SetItemStatus('lock')</script>");


    javascript:

     <script language ="javascript" type="text/javascript" >

    function SetItemStatus(act)
    {
       if(act=="lock")
    {
       document.getElementById("<%=txt_code.ClientID%>").disabled = true;
    }

     return true;
    }

    </script>


    还是没有效果,也没报错
    2009年11月3日 2:04
  • 你完全拷贝上面的代码测试
    上面代码在ie8,ff3.5下均正常

    【孟子E章】
    2009年11月3日 2:19
    版主
  • 这就奇怪了,我这里是IE7+FW2
    会不会是那个head的问题,子页没有head
    2009年11月3日 2:33
  • 刚才直接写
     Page.ClientScript.RegisterStartupScript(this.GetType(), "", "alert('OOXX')", true);

    也没反应

    2009年11月3日 3:29
  • 这就奇怪了,我这里是IE7+FW2
    会不会是那个head的问题,子页没有head
    不是Head的问题

    让你完全拷贝上面的代码。测试结果是什么?

    【孟子E章】
    2009年11月3日 4:47
    版主
  • 给你一个模板页内容页相互访问的例子,你需要对模板页和内容页的机制和关系进行深入的了解。
    MasterPage3.master

    <%@ Master 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">
      protected void Page_Load(object sender, EventArgs e)
      {
        if (Page.IsPostBack)
        {
          String ChildPageTextBoxId = (this.ContentPlaceHolder1.FindControl("TextBox2") as TextBox).ClientID;
          Page.ClientScript.RegisterStartupScript(this.GetType(), "", "alert('OOXX from MasterPage');SetItemStatus('lock','" + ChildPageTextBoxId + "');", true);
        }
      }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    
      <script type="text/javascript">
        function SetItemStatus(act, controlId) {
          if (act == "lock") {
            document.getElementById(controlId).disabled = true;
          }
        }
      </script>
    
    </head>
    <body>
      <form id="form1" runat="server">
      <h1>
        模板页</h1>
      <div>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
      </div>
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
      </form>
    </body>
    </html>
    
    内容页:
    <%@ Page Language="C#" MasterPageFile="~/MasterPage3.master" %>
    <script runat="server">
      protected void Page_Load(object sender, EventArgs e)
      {
        if (Page.IsPostBack)
        {
          String MasterPageTextBoxID = (this.Master.FindControl("TextBox1") as TextBox).ClientID;
          Page.ClientScript.RegisterStartupScript(this.GetType(), "", "alert('OOXX from ContentPage');SetItemStatus('lock','" + this.TextBox1.ClientID + "');SetItemStatus('lock','" + MasterPageTextBoxID + "');", true);
        }
      }
    </script>
    <asp:Content ContentPlaceHolderID="ContentPlaceHolder1" ID="x" runat="server">
      <h2>
        内容页
      </h2>
      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
      <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
      <asp:Button ID="Button1" runat="server" Text="Button" />
    </asp:Content>
    
    你全部拷贝去进行测试。注意:不要漏掉js里面的分号;

    【孟子E章】
    • 已标记为答案 scate233 2009年11月3日 6:16
    2009年11月3日 5:02
    版主
  • 以上代码在ie6,ie7,ie8 ff3.5,chrome3.0,opera 10,safari 4测试都通过。
    如果你完全拷贝上面的代码还不能通过测试,那就是你环境的问题了

    【孟子E章】
    2009年11月3日 5:09
    版主
  • 应该是我的机器问题,东西拷到同事的机器上可以正常运行,但在我这里怎么按都没反应
    2009年11月3日 6:15