如何在更新面板回发后执行javascript回调?

时间:2009-07-20 11:11:17

标签: javascript asp.net-ajax updatepanel callback

我正在使用jQuery tip插件在用户悬停页面的某些元素时显示帮助提示。

我需要在使用css选择器加载页面后注册插件事件。

问题是我使用的是ASP.NET更新面板,在第一次回发后,提示会停止工作,因为更新面板会替换页面内容,但不会重新绑定javascript事件。

我需要一种方法来在更新面板刷新其内容后执行javascript回调,这样我就可以重新绑定javascript事件以使提示再次有效。

有没有办法做到这一点?

5 个答案:

答案 0 :(得分:163)

不要将jQuery代码放在$(document).ready()中,而是将其放在

function pageLoad(sender, args) { 
    ... 
}
每次回发,同步或异步后都会执行

pageLoadpageLoad是ASP.NET AJAX中用于此目的的保留函数名。另一方面,$(document).ready()仅在DOM最初准备好/加载时执行一次。

请参阅此Overview of ASP.NET AJAX client lifecycle events

答案 1 :(得分:19)

pageLoad不起作用。我改用了这个:

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(pageLoaded);

function pageLoaded() {
}

答案 2 :(得分:12)

这可能远非最优雅的解决方案,但它仍然是一个解决方案:

public class UpdatePanel : System.Web.UI.UpdatePanel
{
    /// <summary>
    /// Javascript to be run when the updatepanel has completed updating
    /// </summary>
    [Description("Javascript to be run when the updatepanel has completed updating"),
        Category("Values"),
        DefaultValue(null),
        Browsable(true)]
    public string OnUpdateCompleteClientScript
    {
        get
        {
            return (string)ViewState["OnUpdateCompleteClientScript"];
        }
        set
        {
            ViewState["OnUpdateCompleteClientScript"] = value;
        }
    }

    protected override void OnPreRender(System.EventArgs e)
    {
        base.OnPreRender(e);
        if(!string.IsNullOrEmpty(this.OnUpdateCompleteClientScript))
            Page.ClientScript.RegisterStartupScript(this.GetType(), this.ClientID, string.Concat("Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args){for(var panelId in sender._updatePanelClientIDs){if(sender._updatePanelClientIDs[panelId] == '", this.ClientID, "'){", this.OnUpdateCompleteClientScript, "}}});"), true);
    }
}

像这样使用:

<uc:UpdatePanel OnUpdateCompleteClientScript="alert('update complete');">
    <!-- stuff in here -->
</uc:UpdatePanel>

当然,您需要在webconfig或page中注册自定义控件,以便像这样使用它。

编辑:另外,您看过jquery.live?

了吗?

答案 3 :(得分:0)

如果您想在加载UpdatePanel之前和之后执行特定操作,可以像这样覆盖BeginPostbackRequestEndPostbackRequest

var postbackControl = null;
var updatePanels = null;
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(BeginPostbackRequest);
prm.add_endRequest(EndPostbackRequest);

function BeginPostbackRequest(sender, args) {
    prm._scrollPosition = null;
    postbackControl = args.get_postBackElement();
    postbackControl.disabled = true;
    updatePanels = args._updatePanelsToUpdate;
    // do your stuff
}

function EndPostbackRequest(sender, args) {
    // do your stuff
    postbackControl.disabled = false;
    postbackControl = null;
    updatePanels = null;
}

如果您只想处理更新面板提供的HTML,这非常方便。有些操作需要更多资源,在pageLoad上处理整个DOM树会有点过分。

答案 4 :(得分:0)

使用pageLoaded事件并检查回调或回发:

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(function (sender, args) {
    if (args._panelsUpdated && args._panelsUpdated.length > 0) {
        //callback;
    }
    else {
        //postback;
    }
});
相关问题