Cómo saber si el usuario hace clic en el botón Atrás del navegador o en el botón Actualizar

StackOverflow https://stackoverflow.com/questions/292204

Pregunta

Necesito saber si el usuario hace clic en el botón Atrás del navegador o en el botón Actualizar.

Necesito redirigir la página a la página Error cuando hace clic en el botón Atrás o Actualizar. Cómo hacer esto.

Necesito hacer esto en javascript para mi página ASP.net

¿Fue útil?

Solución

En primer lugar, dar mensajes de error si los usuarios usan Atrás o tienen que actualizar una página por cualquier razón, es una muy mala idea. En cambio, debe lidiar con eso de manera transparente. Piense en una página que no se abre por completo debido a problemas en el nivel de transporte: la única opción que tiene el usuario es volver a cargarla o regresar.

Para responder a su pregunta, debe realizar un seguimiento de la navegación del usuario usted mismo, eso significa en el lado del servidor. Olvídate de java-script aquí. Si el usuario visita un sitio web, puede almacenar esa información en una sesión asociada al usuario (hay varios métodos para mantener estas sesiones únicas, y no entraré en detalles aquí). Si almacena en sus estructuras internas qué páginas visitó el usuario últimamente, es fácil determinar una página que se visita dos veces, o la navegación va hacia el " incorrecto " dirección.

Podría generalizar esto fácilmente (y hacer que todo sea más robusto, por ejemplo, contra usuarios que saltan salvajemente entre URL o retroceden más de un paso a la vez) construyendo un gráfico de "permitido". navegar y atravesarlo mientras el usuario visita sitios web.

El comportamiento correcto entonces si el usuario está haciendo un " incorrecto " la navegación (como retroceder, volver a cargar == visitar dos veces) es volver a encarrilarlo. ¡No dar un mensaje de error del que no puede escapar! Como no se le permite recargar o regresar, no le quedan opciones.

Otros consejos

No puedes. El navegador no envía sus propios eventos ui al servidor. Todo lo que obtienes son solicitudes http y una se parece bastante a la otra. Tal vez hicieron clic en el botón Atrás o tal vez simplemente volvieron a escribir la última URL. Díganos qué problemas está causando y podemos ayudarlo a adaptar su proyecto para que funcione un poco mejor con el protocolo http.

Implemente un PageToken usando un guid / o marca de tiempo almacenada en la sesión y compare el valor con un campo oculto en el formulario. Lo hice a través de un Clase PageToken . Si el valor del campo oculto y la variable de sesión no coinciden, entonces no está sincronizado y lo maneja. El truco es mapear todos los eventos en su página.

public void GeneratePageToken()
{
    SessionVariables currSession = new SessionVariables();
    hfMasterPageToken.Value = System.DateTime.Now.ToString();
    currSession.PageToken = hfMasterPageToken.Value;
}

public string GetLastPageToken
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return currSession.PageToken;
    }
}

public bool TokensMatch
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return (currSession.PageToken != null
            && currSession.PageToken == hfMasterPageToken.Value);
    }
}

En su método de evento antes de su código regular:

if (this.TokensMatch == false)
{
    //Reload the data.
    //Generates a NewPageToken (this.GeneratePageToken();)
    ReloadDataMethod();
    this.MessageToUser =
     "Data reloaded.  Click Edit or Insert button to change.";
    this.MessageType = MessageToUserType.Success;
    this.DisplayMessageToUser = true;
    return;
}

Con Site.Master

En su Site.Master , coloque después de <body>

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<dx:ASPxLoadingPanel ID="MainLoadingPanel" runat="server" ClientInstanceName="MainLoadingPanel" Modal="True" />
<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    MainLoadingPanel.Show();
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            MainLoadingPanel.Hide();
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Sin Site.Master

En su código común, coloque después de <body>

<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

Supongo que desea hacer esto debido a la devolución de datos para evitar volver a enviar alguna acción o datos, ¿verdad? Irónicamente, esto no era un problema tan grande antes de los formularios web asp.net ... porque generalmente tenía que publicar en una URL diferente en lugar de la misma (al igual que asp.net mvc en realidad).

Un truco que me gustó usar ... aunque en el punto más técnico es más lento ... fue tener una página de entrada y una página de publicación. El resultado HTML de la página de publicación fue un HTML súper mínimo con un pequeño javascript que reemplazó la url actual (de la página de publicación) en el historial del navegador con la página de resultados (o incluso la página de referencia original si realmente lo deseaba). El resultado fue cuando el usuario hacía clic en el botón Atrás, lo enviaban a la página de entrada original, o si hacía clic en actualizar, ya estaba en la nueva página de resultados.

<html><body onload="location.replace('someURL.asp')"></body></html>

Lo hicimos en Java / Struts1 poniendo una propiedad en el botón de enviar. Si se hizo clic en el botón Enviar, el texto del botón se enviaría a la propiedad en el ActionForm. Si el usuario actualizó la información, el valor no se estableció, por lo que sabíamos que el usuario no había hecho clic en el botón. En este caso donde la propiedad estaba vacía, volvimos y renderizamos la primera página del flujo de página. YMMV en ASP.Net.

Esto simplemente detecta si el usuario llega a su página usando los botones atrás / adelante ... el único problema es con IE8 y versiones anteriores, la versión del navegador no puede manejar esto.

if(performance.navigation.type == 2)
{
    //Do your code here
}

.NET 3.5 puede manejar muy bien los botones de retroceso (y avance) del navegador. Buscar con Google: " Scriptmanager EnableHistory " ;. Puede controlar qué acciones del usuario agregarán una entrada al historial del navegador (ScriptManager - > AddHistoryPoint) y su aplicación ASP.NET recibe un evento cada vez que el usuario hace clic en los botones Atrás / Adelante del navegador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top