我正在使用jQuery tip插件在用户悬停页面的某些元素时显示帮助提示。
我需要在使用css选择器加载页面后注册插件事件。
问题是我使用的是ASP.NET更新面板,在第一次回发后,提示会停止工作,因为更新面板会替换页面内容,但不会重新绑定javascript事件。
我需要一种方法来在更新面板刷新其内容后执行javascript回调,这样我就可以重新绑定javascript事件以使提示再次有效。
有没有办法做到这一点?
答案 0 :(得分:163)
不要将jQuery代码放在$(document).ready()
中,而是将其放在
function pageLoad(sender, args) {
...
}
每次回发,同步或异步后都会执行 pageLoad
。 pageLoad
是ASP.NET AJAX中用于此目的的保留函数名。另一方面,$(document).ready()
仅在DOM最初准备好/加载时执行一次。
答案 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之前和之后执行特定操作,可以像这样覆盖BeginPostbackRequest
和EndPostbackRequest
:
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;
}
});