web-dev-qa-db-fra.com

Comment détecter/suivre la postback en javascript?

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

23
Subrat

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 déjà fait quelque chose de similaire et ça marche.

39
o.k.w

Dans certains cas, vous souhaiterez peut-être vérifier la publication sans code côté serveur. Par exemple, dans SharePoint, vous ne pouvez pas avoir de blocs de code dans les pages SharePoint Designer. Vous ne pouvez donc utiliser aucune solution nécessitant <% = quelque chose%>. Voici une alternative qui n'implique 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 fonctionnalité, selon la façon dont vous la regardez), cela détectera non seulement les publications, mais toute instance où la page est liée à elle-même.

17
Daniel

Si vous souhaitez vérifier si la page en cours sera une publication si l'utilisateur clique sur un bouton d'envoi, 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.

Toutefois, si vous voulez savoir si la page actuelle a été générée en réponse à une publication, vous devez d'abord insérer ces données dans la page côté serveur.

Par exemple:

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

Comme JavaScript ne devrait pas être écrit avec du code côté serveur, et injecter de nouveaux éléments dans la page me semble excessif, il me semble que la solution la plus simple consiste à ajouter [datat-*] à l'élément <head>:

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

Ceci peut alors être accédé comme:

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 également utiliser:

En 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')
5
zzzzBov

Voir ci-dessous:

<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>
4
Brij

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");
});
4
user4640122

Vous ne pouvez garder une trace de la publication si vous utilisez des requêtes AJAX ou si vous avez un champ caché de quelque sorte que le javascript lit au chargement de la page. Sinon, la page est régénérée et toutes les données POST sont perdues. comme on peut s'y attendre et espérer.

0
Robert Massaioli

sur Page_Load sur votre serveur: 

Du côté serveur

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

Ensuite, dans votre script qui s'exécute pour onLoad, vérifiez l'existence de cette variable.

if (isPostBack){
   //do something here
}
0
Lequoa

Cela devrait fonctionner pour les pages ASP.Net sans s'appuyer sur une variable/contrôle fourni par le système:

function isPostBack(frmID) {
    var eventtarget = "";
    var eventargument = "";

    if (!!frmID) {
        if (document.forms.length == 0) return false;

        sForm = document.forms[0];
    }
    else {
        sForm = document.getElementById(frmID);

        if (!sForm) return false;
    }

    if (sForm.__EVENTTARGET) eventtarget = sForm.__EVENTTARGET.value;
    else return false;

    if (sForm.__EVENTARGUMENT) eventargument = sForm.__EVENTARGUMENT.value;
    else return false;

    if (eventtarget != "" || eventargument != "") return true;
    else return false;
}
0
Olymp Medco

Voici la solution utilisant jQuery:

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