Как выполнить обратный вызов javascript после обратной передачи панели обновления?
Я использую плагин jQuery tip, чтобы показывать подсказки справки, когда пользователь наводит определенные элементы страницы.
Мне нужно зарегистрировать события плагина после загрузки страницы с помощью селекторов css.
проблема в том, что я использую ASP.NET панель обновления и после первой обратной передачи советы перестают работать, потому что панель обновления заменяет содержимое страницы, но не повторно связывает события javascript.
Мне нужен способ выполнить обратный вызов javascript после Панель обновления обновляет свое содержимое, поэтому я могу повторно привязать события javascript, чтобы Советы снова работали.
есть ли способ сделать это?
5 ответов:
вместо того, чтобы поместить ваш код jQuery внутри
$(document).ready(), положил его внутриfunction pageLoad(sender, args) { ... }
pageLoadвыполняется после каждой обратной передачи, синхронный или асинхронный.pageLoad- это зарезервированное имя функции в ASP.NET AJAX то есть для этой цели.$(document).ready()С другой стороны, выполняется только один раз, когда DOM изначально готов/загружен.посмотреть этот обзор ASP.NET события жизненного цикла клиента AJAX
загрузка страниц не работает. Я использовал это вместо:
var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_pageLoaded(pageLoaded); function pageLoaded() { }
это, вероятно, далеко не самое элегантное решение, но его решение тем не менее:
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>конечно, вам нужно будет зарегистрировать пользовательский элемент управления в youre webconfig или page, чтобы использовать его таким образом.
Edit: кроме того, вы смотрели на jquery.жить?
если вы хотите выполнить определенные операции до и после загрузки 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, который был доставлен с помощью панели обновления. Некоторые операции требуют больше ресурсов, и было бы излишним обрабатывать все дерево DOM на
pageLoad.
используйте событие pageLoaded и проверьте, является ли обратный вызов или обратная передача:
var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_pageLoaded(function (sender, args) { if (args._panelsUpdated && args._panelsUpdated.length > 0) { //callback; } else { //postback; } });
Comments