2009-07-20 67 views
71

我正在使用jQuery提示插件在用户悬停页面的某些元素时显示帮助提示。如何在更新面板回发后执行javascript回调?

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

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

我需要一种方式来执行一个JavaScript回调后更新面板刷新其内容,所以我可以重新绑定JavaScript事件,让技巧再次工作。

有没有办法做到这一点?

回答

163

而不是把你的jQuery代码的$(document).ready()里面,把它

function pageLoad(sender, args) { 
    ... 
} 

pageLoad之后每次回发,同步或异步执行的内部。 pageLoad是ASP.NET AJAX中用于此目的的保留函数名称。另一方面,$(document).ready()仅在DOM初始就绪/加载时执行一次。

看到这个Overview of ASP.NET AJAX client lifecycle events

+4

感谢您的回答。 我不知道有一个客户端pageLoad事件,这正是我需要的。问题解决了。 :) – tsbnunes 2009-07-20 12:48:30

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或页面中使用它就像这样。

编辑:还有,你有没有看着jquery.live?

+1

自定义更新面板用户控件是矫枉过正我的问题,但我不知道该jquery.live方法,它可能会工作,解决我的问题! 但在这种情况下,我认为Russ Cam提供的解决方案更好,我已经尝试过并且工作良好。 感谢您的帮助。 :) – tsbnunes 2009-07-20 12:54:23

+0

必须有一个更简单的方法..? – 2010-07-29 14:49:46

19

的页面加载没有工作。我用这个来代替:

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

function pageLoaded() { 
} 
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树会是矫枉过正的。

0

使用pageLoaded事件,并检查是否回调或回传:

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