2009-07-20 8 views
71

J'utilise un plugin tip jQuery pour afficher des conseils d'aide lorsque l'utilisateur survole certains éléments de la page.Comment faire exécuter un rappel javascript après une publication dans le panneau de mise à jour?

Je dois enregistrer les événements du plugin après le chargement de la page en utilisant les sélecteurs css. Le problème est que j'utilise un panneau de mise à jour ASP.NET et après la première publication, les astuces ne fonctionnent plus car le panneau de mise à jour remplace le contenu de la page mais ne recompose pas les événements javascript.

J'ai besoin d'un moyen d'exécuter un rappel javascript après que le panneau de mise à jour actualise son contenu, afin que je puisse relier les événements javascript pour que les conseils fonctionnent à nouveau.

Y at-il un moyen de le faire?

Répondre

163

Au lieu de mettre votre code jQuery intérieur de $(document).ready(), mettez-le dans

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

pageLoad est exécuté après chaque postback, synchrone ou asynchrone. pageLoad est un nom de fonction réservé dans ASP.NET AJAX qui est à cet effet. D'autre part, $(document).ready() est exécuté une seule fois, lorsque le DOM est initialement prêt/chargé.

Voir cette Overview of ASP.NET AJAX client lifecycle events

+4

Merci pour votre réponse. Je ne savais pas qu'il y avait un événement pageLoad côté client et c'est exactement ce dont j'ai besoin. Problème résolu. :) – tsbnunes

+0

je ne savais pas non plus, utile! Gardez à l'esprit que je soupçonne que cela se produira pour tous les UP sur une page, vous aurez besoin de mon filtre clientid pour être spécifique –

+0

+ 1 FTW! Je ne savais pas non plus que cela existait et c'était exactement ce que je cherchais pour résoudre mon problème! Big ups @Russ Cam! – longda

12

Ceci est probablement loin d'être la solution la plus élégante, mais sa solution néanmoins:

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); 
    } 
} 

utiliser comme ceci:

<uc:UpdatePanel OnUpdateCompleteClientScript="alert('update complete');"> 
    <!-- stuff in here --> 
</uc:UpdatePanel> 

Bien sûr, vous aurez besoin d'enregistrer le contrôle personnalisé dans youre webconfig ou page pour l'utiliser comme ça.

Edit: aussi, avez-vous regardé jquery.live?

+1

La mise à jour personnalisée Panneau de contrôle utilisateur est surpuissant pour mon problème, mais je ne savais pas sur la méthode jquery.live et il serait probablement travailler et Résolvez mon problème! Mais dans ce cas je pense que la solution présentée par Russ Cam est meilleure et je l'ai déjà essayé et fonctionne bien. Merci pour votre aide. :) – tsbnunes

+0

Il doit y avoir un moyen plus facile ..? –

19

Le pageLoad ne fonctionnait pas. J'ai utilisé ce lieu:

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

function pageLoaded() { 
} 
+2

erreur de référence uncaught, Sys n'est pas défini –

+1

Fonctionne bien ici – Brent

+2

Si vous obtenez un identifiant Sys non défini, c'est parce que vous appelez le script, AVANT le Le script du gestionnaire de script est chargé. Habituellement dans le , tandis que le truc de scriptmanger est chargé dans - Oui, je sais, non?! Il suffit de déplacer votre script vers le bas de la page ou votre contrôle et il fonctionnera avec la réponse acceptée bien. – ppumkin

0

Si vous voulez faire des opérations spécifiques avant et après l'UpdatePanel chargé, vous pouvez remplacer BeginPostbackRequest et EndPostbackRequest comme ceci:

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; 
} 

Ceci est très pratique si vous voulez pour traiter uniquement le code HTML fourni par le panneau de mise à jour. Certaines opérations nécessitent plus de ressources et il serait trop difficile de traiter l'intégralité de l'arborescence DOM sur pageLoad.

0

Utilisez événement pageLoaded et vérifier si le rappel ou postback:

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