Подтвердить что ты не робот

Как выполнить обратный вызов javascript после обратной передачи панели обновления?

Я использую плагин подсказки jQuery, чтобы отображать подсказки, когда пользователь наводит определенные элементы страницы.

Мне нужно зарегистрировать события плагина после загрузки страницы с помощью селекторов css.

Проблема заключается в том, что я использую панель обновления ASP.NET и после первой обратной передачи советы перестают работать, потому что панель обновления заменяет содержимое страницы, но не восстанавливает события javascript.

Мне нужен способ выполнить обратный вызов javascript после того, как панель обновления обновит его содержимое, поэтому я могу перестроить события javascript, чтобы снова использовать подсказки.

Есть ли способ сделать это?

4b9b3361

Ответ 1

Вместо того, чтобы помещать код jQuery внутри $(document).ready(), поместите его внутри

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

pageLoad выполняется после каждой обратной передачи, синхронной или асинхронной. pageLoad - зарезервированное имя функции в ASP.NET AJAX для этой цели. $(document).ready(), с другой стороны, выполняется только один раз, когда DOM изначально готов/загружен.

Смотрите Обзор жизненных циклов клиента ASP.NET AJAX

Ответ 2

СтраницаLoad не работает. Вместо этого я использовал это:

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

function pageLoaded() {
}

Ответ 3

Это, вероятно, далеко не самое изящное решение, но его решение тем не менее:

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 или странице, чтобы использовать его следующим образом.

Edit: также вы просмотрели jquery.live?

Ответ 4

Если вы хотите выполнять определенные операции до и после загрузки 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.

Ответ 5

Используйте событие pageLoaded и проверьте, есть ли обратная связь или обратная связь:

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