Comment détecter / suivre postback en javascript?
Comment détecter, de suivre et de vérifier publication en javascript(e.g dans asp.net Page.isPostBack ())? Toute suggestion?
10 réponses
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 similaire avant et cela fonctionne.
dans certains cas, vous pouvez vouloir vérifier pour postback sans n'importe quel code côté serveur. Par exemple, dans SharePoint, vous ne pouvez pas avoir de blocs de code dans les pages SharePoint Designer, donc vous ne pouvez pas utiliser une solution qui nécessite <%=something %>. 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 une caractéristique, selon la façon dont vous la regardez), cela détectera non seulement les postbacks, mais toute instance où la page se lie à elle-même.
si vous voulez vérifier si la page courante sera un postback si l'utilisateur clique sur un bouton Soumettre, 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 voulez voir si la page actuelle a été générée en réponse à un postback, alors vous devez insérer ces données dans la page du côté du serveur en premier.
pour exemple:
function isPostBack() {
return <%= Page.IsPostBack %>;
}
comme JavaScript ne devrait pas être écrit avec du code côté serveur, et l'injection de nouveaux éléments dans la page semble comme exagérée, il me semble que la solution la plus simple est d'ajouter [datat-*]
attributs à <head>
élément:
Page.Header.Attributes["data-is-postback"] IsPostBack ? "true" : "false";
on peut alors y accéder par:
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 aussi utiliser:
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:
<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 garder la trace du postback que si vous utilisez des requêtes AJAX ou si vous avez un champ caché d'une sorte que le javascript lit sur le chargement de page. Sinon, la page est régénérée et toutes les données POST sont perdues; comme vous vous y attendiez et l'espérez.
Voici la solution en 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 de caractères avec les balises de script nécessaires
Côté Serveur
if (Page.IsPostBack){
ClientScript.RegisterClientScriptBlock(GetType(),
"IsPostBack", "var isPostBack = true;", true);
}
ensuite dans votre script qui s'exécute pour l'onLoad, Vérifiez l'existence de cette variable.
if (isPostBack){
//do something here
}
cela devrait fonctionner pour ASP.Net pages sans utilisation d'un backend variable/control fournie:
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;
}