asp.net - hacer - javascript:__dopostback
¿Cómo detectar/rastrear la devolución en javascript? (10)
ASPX:
<input type="hidden" id="_ispostback" value="<%=Page.IsPostBack.ToString()%>" />
Guión del lado del cliente:
function isPostBack() { //function to check if page is a postback-ed one
return document.getElementById(''_ispostback'').value == ''True'';
}
PD: no lo he probado pero he hecho algo similar antes y funciona.
¿Cómo detectar / rastrear / verificar la devolución en javascript (por ejemplo, en asp.net Page.isPostBack ())? ¿Cualquier sugerencia?
Aquí está la solución usando jQuery:
$("a[href^=''javascript:__doPostBack'']").click(function () {
alert(''ok'');
});
Como JavaScript no debe escribirse con código del lado del servidor, e inyectar nuevos elementos en la página parece una exageración, me parece que la solución más simple es agregar [datat-*]
al elemento <head>
:
Page.Header.Attributes["data-is-postback"] IsPostBack ? "true" : "false";
Esto puede ser accedido como:
jQuery:$(''head'').data(''isPostback'');
Vanilla JS:
document.head.getAttribute(''data-is-postback'') === ''true'';
Por supuesto, si trata el atributo [data-is-postback]
como un atributo booleano, podría usar alternativamente:
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'')
En algunos casos, es posible que desee verificar la devolución de datos sin ningún código del lado del servidor. Por ejemplo, en SharePoint, no puede tener bloques de código en las páginas de SharePoint Designer, por lo que no puede usar ninguna solución que requiera <% = algo%>. Aquí hay una alternativa que no involucra ningún código del lado del servidor:
<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>
Una advertencia (o característica, dependiendo de cómo se mire), detectará no solo devoluciones de datos, sino también cualquier instancia en la que la página se vincule a sí misma.
Esto debería funcionar para las páginas ASP.Net sin depender de una variable / control provisto por el backend:
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;
}
Si desea verificar si la página actual será una devolución de datos si el usuario hace clic en un botón de envío, puede verificar la presencia de ViewState:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="xxxxx" />
Puede usar algo como document.getElementById("__VIEWSTATE")
o el equivalente de jQuery.
Sin embargo, si desea ver si la página actual se generó en respuesta a una devolución de datos, primero debe insertar esos datos en la página en el lado del servidor.
Por ejemplo:
function isPostBack() {
return <%= Page.IsPostBack %>;
}
Solo puede realizar un seguimiento de la devolución de datos si está utilizando solicitudes AJAX o tiene un campo oculto de algún tipo que lee el javascript en la carga de la página. De lo contrario, la página se regenera y todos los datos de la POST se pierden; como esperarías y esperarías.
Tengo una solución que funcionó para mí.
// Postback catch
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function (s, e) {
alert("post back");
});
Vea lo siguiente:
<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>
en Page_Load en su servidor: lo siguiente utiliza una sobrecarga de RegisterClientScriptBlock () que rodeará nuestra cadena con las etiquetas de script necesarias
Lado del servidor
if (Page.IsPostBack){
ClientScript.RegisterClientScriptBlock(GetType(),
"IsPostBack", "var isPostBack = true;", true);
}
Luego, en la secuencia de comandos que se ejecuta para onLoad, verifique la existencia de esa variable.
if (isPostBack){
//do something here
}