Comment détecter / suivre le retour en javascript?

Comment détecter / suivre / vérifier le retour dans javascript (par exemple dans asp.net Page.isPostBack ())? Toute suggestion?

ASPX:

<input type="hidden" id="_ispostback" value="<%=Page.IsPostBack.ToString()%>" /> 

Script côté client:

 function isPostBack() { //function to check if page is a postback-ed one return document.getElementById('_ispostback').value == 'True'; } 

PS: Je ne l'ai pas testé, mais j'ai fait quelque chose de semblable avant et ça marche.

Dans certains cas, vous pouvez vérifier s'il n'y a pas de code côté serveur. Par exemple, dans SharePoint, vous ne pouvez pas avoir de blocs de code dans les pages SharePoint Designer, de sorte que vous ne pouvez utiliser aucune solution nécessitant <% = something%>. Voici une alternative qui ne comporte aucun code côté serveur:

 <script type="text/javascript"> function isPostBack() { return document.referrer.indexOf(document.location.href) > -1; } if (isPostBack()){ document.write('<span style="color:red;">Your search returned no results.</span><br/>'); } </script> 

Une mise en garde (ou une fonction, selon la façon dont vous la regardez), cela détectera non seulement les retours, mais toute instance où la page se lie à elle-même.

Si vous souhaitez vérifier si la page actuelle sera un postback si l'utilisateur clique sur un bouton de soumission, vous pouvez vérifier la présence de ViewState:

 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="xxxxx" /> 

Vous pouvez utiliser quelque chose comme document.getElementById("__VIEWSTATE") ou l'équivalent jQuery.

Cependant, si vous souhaitez voir si la page actuelle a été générée en réponse à un retour, vous devez d'abord insérer ces données sur la page du côté du serveur.

Par exemple:

 function isPostBack() { return <%= Page.IsPostBack %>; } 

Comme JavaScript ne doit pas être écrit avec le code côté serveur, et l'injection de nouveaux éléments dans la page semble être excessive, il me semble que la solution la plus simple est d'ajouter les [datat-*] à l'élément <head> :

Dans Page_Load:

 Page.Header.Attributes["data-is-postback"] IsPostBack ? "true" : "false"; 

On peut alors accéder à ceci:

JQuery:

 $('head').data('isPostback'); 

Vanilla JS:

 document.head.getAttribute('data-is-postback') === 'true'; 

Bien sûr, si vous traitez l'attribut [data-is-postback] comme un attribut booléen, vous pouvez alternativement utiliser:

Dans Page_Load:

 if (IsPostBack) { Page.Header.Attributes.Add("data-is-postback", ""); } else { Page.Header.Attributes.Remove("data-is-postback"); } 

JQuery:

 $('head').is('[data-is-postback]'); 

Vanilla JS:

 document.head.hasAttribute('data-is-postback') 

Voir suivant:

 <script type="text/javascript"> function invokeMeMaster() { var chkPostBack = '<%= Page.IsPostBack ? "true" : "false" %>'; if (chkPostBack == 'false') { alert('Only the first time'); } } window.onload = function() { invokeMeMaster(); }; </script> 

J'ai une solution qui a fonctionné pour moi.

 // Postback catch var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_endRequest(function (s, e) { alert("post back"); }); 

Vous ne pouvez suivre que le postback si vous utilisez des requêtes AJAX ou avez un champ caché d'une sorte que le javascript lit sur le chargement de la page. Sinon, la page est régénérée et toutes les données POST sont perdues; Comme vous vous attendez et espérons.

Voici la solution utilisant jQuery:

 $("a[href^='javascript:__doPostBack']").click(function () { alert('ok'); }); 

Sur Page_Load sur votre serveur: ce qui suit utilise une surcharge de RegisterClientScriptBlock () qui entourera notre chaîne avec les balises de script nécessaires

Du côté serveur

 if (Page.IsPostBack){ ClientScript.RegisterClientScriptBlock(GetType(), "IsPostBack", "var isPostBack = true;", true); } 

Ensuite, dans votre script qui fonctionne pour le OnLoad, vérifiez l'existence de cette variable.

 if (isPostBack){ //do something here }