Ich verwende ein jQuery-Plug-In, um Hilfetipps anzuzeigen, wenn der Benutzer bestimmte Elemente der Seite anzeigt.
Ich muss die Plugin-Ereignisse registrieren, nachdem die Seite mit css-Selektoren geladen wurde.
Das Problem ist, dass ich ein ASP.NET Update Panel verwende. Nach dem ersten Postback funktionieren die Tipps nicht mehr, da das Update Panel den Seiteninhalt ersetzt, die JavaScript-Ereignisse jedoch nicht erneut bindet.
Ich brauche eine Möglichkeit, einen Javascript-Rückruf auszuführen, nachdem das Update-Panel seinen Inhalt aktualisiert hat, sodass ich die JavaScript-Ereignisse erneut binden kann, damit die Tipps wieder funktionieren.
Gibt es eine Möglichkeit, dies zu tun?
Anstatt Ihren jQuery-Code in $(document).ready()
einzufügen, geben Sie ihn ein
function pageLoad(sender, args) {
...
}
pageLoad
wird nach jedem Postback synchron oder asynchron ausgeführt. pageLoad
ist ein reservierter Funktionsname in ASP.NET AJAX, der zu diesem Zweck verwendet wird. $(document).ready()
wird dagegen nur einmal ausgeführt, wenn das DOM anfangs bereit ist/geladen wird.
Siehe diese Übersicht über ASP.NET AJAX - Clientlebenszyklusereignisse
Das PageLoad hat nicht funktioniert. Ich habe das stattdessen verwendet:
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(pageLoaded);
function pageLoaded() {
}
Dies ist wahrscheinlich nicht die eleganteste Lösung, aber trotzdem eine Lösung:
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);
}
}
Verwenden Sie es so:
<uc:UpdatePanel OnUpdateCompleteClientScript="alert('update complete');">
<!-- stuff in here -->
</uc:UpdatePanel>
Natürlich müssen Sie das benutzerdefinierte Steuerelement in Ihrer webconfig oder Seite registrieren, um es auf diese Weise verwenden zu können.
Edit: auch hast du jquery.live angesehen?
Verwenden Sie das pageLoaded-Ereignis und prüfen Sie, ob Rückruf oder Postback:
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(function (sender, args) {
if (args._panelsUpdated && args._panelsUpdated.length > 0) {
//callback;
}
else {
//postback;
}
});
Wenn Sie vor und nach dem Laden von UpdatePanel bestimmte Vorgänge ausführen möchten, können Sie BeginPostbackRequest
und EndPostbackRequest
wie folgt überschreiben:
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;
}
Dies ist sehr praktisch, wenn Sie nur HTML verarbeiten möchten, das vom Aktualisierungsfenster bereitgestellt wurde. Einige Operationen erfordern mehr Ressourcen und es wäre übertrieben, die gesamte DOM-Struktur auf pageLoad
zu verarbeiten.