如何在每次回发时注册Javascript函数?

时间:2010-03-17 14:27:54

标签: c# asp.net javascript postback scriptmanager

我在用户控件中有一个树视图。我需要使用每个异步回发运行一个javascript函数来将div旋转到正确的位置。我已经有了它的工作,但我认为必须采用“更清洁”的方式来实现它。在控件的Page_Load函数中,我有以下代码。有没有更好的方法呢?

ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "key" + DateTime.Now.Ticks, "RestorePosition();", true);

为了寻找这个答案的人的利益,这是我最终做的工作。在ascx页面的顶部,我有以下代码:


<script type="text/javascript">
    function pageLoad(sender, args) {
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(SavePosition);
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(RestorePosition);
    }

    function SavePosition(sender, args) {
        document.getElementById('hdnScrollSaver').value = document.getElementById('reportTreeViewdiv').scrollTop;
    } 
    function RestorePosition(sender, args) {
        document.getElementById('reportTreeViewdiv').scrollTop = document.getElementById('hdnScrollSaver').value;
    } 

</script>

然后我将树视图包装在div标签中,如下所示:


<div class="reportTreeView" id="reportTreeViewdiv">
                    <asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate" 
                        OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" PathSeparator="|" SkinID="ReportTreeView" />
                </div>

希望这有助于某人。

3 个答案:

答案 0 :(得分:4)

Ajax为您提供类似于ASP.Net页面的页面生命周期,但在客户端。因此,在pageLoad事件中,我们可以连接每个开始请求和结束请求时要调用的函数。

function pageLoad(sender, args) {
  Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
  Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);
}

function beginRequest(sender, args) {
        // begin request code - i.e. make a "processing" div visible
}

function endRequest(sender, args) {
        // we are back
        RestorePosition(); 
}

答案 1 :(得分:1)

我认为这是一种“干净”的方式。您正在使用ScriptManager的方式。

如果您不喜欢该行代码的外观,您可以随时将其重构为“脚本实用程序”类或其他内容。我不会,但那只是我。

答案 2 :(得分:1)

我认为你正确地这样做了。我会摆脱这个独特的钥匙。

根据MSDN

  

通过使用密钥识别脚本,多个服务器控件实例可以请求脚本块,而不会将其发送到输出流两次。

     

具有相同关键参数值的任何脚本块都被视为重复。

该密钥用于防止您多次创建脚本,因此您不需要它在您的情况下是唯一的。