如何控制在UpdatePanel局部回发结束后运行哪些JavaScript?

6

我知道我可以钩入客户端事件,在每次部分页面回发后运行JavaScript;但是,我想做这样的事情:

protected void FooClicked(object sender, EventArgs e) {
        ClientScript.RegisterStartupScript(GetType(), "msg", "showMsg('Foo clicked');",true);        
}

我知道我可以通过隐藏字段进行完全的黑客攻击,并在每次回发后运行某些东西,但应该有一种类似于这种方式的相当直接的方法。

4个回答

9
您所描述的具体代码示例无法与部分 post-back 一起使用,因为 ClientScript.RegisterStartupScript() 在请求生命周期的输出构建阶段将 JS 写入页面;而部分 postback 只通过 JavaScript 更新页面的选定部分(尽管整个页面的标记,包括启动脚本,都在服务器上生成)。
要紧密模仿您所描述的内容,您应该在 UpdatePanel 中包含一个 Literal 控件,并在部分 postback 期间将内容面板的 Text 属性设置为要运行的脚本。
myLiteral.Text = "<script type=\"JavaScript\">doStuff();</script>";

在我看来,更合适的方法是使用客户端异步回发的 API来注册一个事件处理程序,在回发完成时运行它:

function endRequestHandler(sender, args) {
    doStuff();
}

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);

如果您需要将在后台生成的信息传递到处理程序中,可以通过隐藏字段传递,并从DOM中获取该信息以在客户端处理程序中使用。


@Rex 我原计划使用隐藏字段和一个始终触发的事件处理程序,但我希望有一种类似于我描述的机制。目前为止我发现这是唯一的选择。 - Mark
@Rex,我已经写下了我如何使用这种方法来实现相同目标的过程。http://fooberry.com/2009/05/25/running-specific-javascript-after-partial-postback/ - Mark

2
这是更加优雅的方式,我认为。显然,ASP AJAX会调用任何名为pageLoad的JS函数。因此,编写一个名为pageLoad的函数,它将在每次页面加载时执行,即使是部分更新后也是如此。

1

<script type="text/javascript" language="javascript">
    function ValidateUserRole() {  
        var answer = confirm("Are you sure..................")
        if (answer) {
            var btnRoleReleatedButton = '<%=btnRoleReleatedButton.ClientID%>';
            document.getElementById(btnRoleReleatedButton).click();
        }
        else {
            return false;
        }
    }
</script>

Tier 3 :<asp:UpdatePanel ID="upTier3Details" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:DropDownList ID="ddlTier3" runat="server" CssClass="ddlextralarge" Width="350" />
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ddlUserRole" EventName="SelectedIndexChanged" />
    </Triggers>
</asp:UpdatePanel>


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接