繁体   English   中英

RegisterStartupScript的含义:会多久调用一次JavaScript代码?

[英]Making sense of RegisterStartupScript: How often will the JavaScript code be called?

ScriptManager.RegisterStartupScript文档说(重点是我):

使用ScriptManager控件为每个异步回发注册一个启动脚本块,并将该脚本块添加到页面。

[...]

备注

您可以使用此方法注册每次发生异步回发时都包含的启动脚本块 [...]

因此,我期望一旦在RegisterStartupScript中注册了脚本块,便会在随后的每个异步回发中执行该脚本块。 但是,这不会发生。 这是一个MCVE:

<%@ Page Language="C#" %>
<!DOCTYPE html>
<script runat="server">
    protected void btnRegisterScript_Click(object sender, EventArgs e)
    {
        ScriptManager.RegisterStartupScript(this, this.GetType(), "Test script",
            "window.alert('Script triggered!');", true);
    }

    protected void btnRegularPostback_Click(object sender, EventArgs e)
    {
        // Do nothing
    }
</script>
<html>
<head>
    <title></title>
</head>
<body>
    <form runat="server">
        <asp:ScriptManager runat="server" />
        <asp:UpdatePanel runat="server">
            <ContentTemplate>
                <asp:Button ID="btnRegisterScript" Text="Register Script" runat="server" OnClick="btnRegisterScript_Click" />
                <asp:Button ID="btnRegularPostback" Text="Regular Postback" runat="server" OnClick="btnRegularPostback_Click" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>

复制:

  1. 点击“注册脚本”。
  2. 点击“常规回发”。

预期结果:

步骤1和步骤2均会引发JavaScript警报(因为步骤1已注册脚本,而步骤2是异步回发)。

实际结果:

只有步骤1会导致JavaScript警报。

这对我很好。 希望仅在步骤1(而不是步骤2)期间发生警报。 但是,该行为与文档不匹配,因此,我想知道造成误解的原因。

我刚刚尝试了您描述的情况,这就是我观察到的情况:每次单击“注册脚本”按钮时,都会出现一个<script type="text/javascript">window.alert('Script triggered!');</script>标签被添加为“ head”标签的子级。 因此,如果您单击3次,将在head标签下获得3个script标签。 我相信这就是文档中关于每个异步回发的内容。

单击“常规回发”按钮后,无法执行“ head”标记中已注册的脚本(通过“注册脚本”注册)。 并且此按钮的事件处理程序中没有注册脚本。 因此,我不希望脚本在“常规回发”按钮单击后执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM