javascript - chrome - onbeforeunload ejemplo
¿Puedo evitar que se llame a window.onbeforeunload cuando se hace una llamada AJAX? (9)
Esto es realmente extraño, ¿estás seguro de que tu llamada Ajax no está cargando un nuevo enlace?
Asegúrese de leer esta especificación relevante: antes de la descarga de la especificación
Vea si la llamada Ajax puede desencadenar cualquiera de las acciones enumeradas en la tabla Para invocar .
Tengo un control de grilla basado en AJAX.
Enganchamos en la ventana. Antes de descargar el evento, verificamos si tienen datos no guardados y, si es así, preséntalos con un mensaje "¿Estás seguro de que deseas irte ... tienes datos no guardados ...".
Todo esto es bueno
Pero las llamadas AJAX también activan window.onbeforeunload y si la cuadrícula tiene datos no guardados y hacemos una llamada AJAX (como para eliminar una fila en otra grilla) el usuario obtiene el mensaje "Are you sure you want to navigate away ... you? tiene datos no guardados ... "mensaje que no es bueno.
¿Es posible suprimir el evento onbeforeunload para llamadas AJAX? ¿O es posible detectar que una llamada es una llamada AJAX? ¡De lo contrario tendremos que piratear!
Gracias
Si está hablando de devoluciones parciales de ASP.NET AJAX, hoy también me encontré con este comportamiento, haciendo exactamente lo mismo. (Si no lo eres, ignora mi publicación por completo).
En mi experiencia hasta el momento, parece que si una devolución de datos parcial se desencadena por una entrada , no se activará antes de la descarga durante una devolución de datos parcial, pero si la devolución de datos parcial se desencadena por un hipervínculo , lo hará. Parece que el navegador supone que está navegando si hace clic en cualquier elemento de una etiqueta de anclaje (solo probado en IE y Firefox, pero sí).
Si la página tiene o no un cierto campo oculto ya es lo que estaba usando para determinar el lado del cliente cuando es apropiado mostrar la advertencia de navegación, así que pude solucionar esto de manera muy simple al agregar una verificación del valor del campo oculto a la condición on onforeforeunload if y el enganche en los manejadores BeginRequest y EndRequest de PageRequestManager para establecer el valor. Eso efectivamente desactiva la advertencia durante las devoluciones de datos parciales. Podría agregar lógica más complicada aquí si hubiera cosas más específicas que quisiera verificar.
Aquí hay una muestra de código realmente simplificada. (Lo siento si lo reduje y lo censuró hasta el punto en que no funciona, pero debería darle una idea).
window.onbeforeunload = checkNavigateAway;
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest);
function onBeginRequest(sender, args) {
var navigateAwayFlag = $("input[id*=''navigateAwayValue'']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "false";
}
}
function onEndRequest(sender, args) {
var navigateAwayFlag = $("input[id*=''navigateAwayValue'']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "true";
}
}
function checkNavigateAway() {
var navigateAwayFlag = $("input[id*=''navigateAwayValue'']");
if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true")
{
return "Warning Text";
}
}
Editar : malas noticias. Lo anterior no parece funcionar en IE6. Parece que dispara eventos en un orden diferente al de Firefox, por lo que antes de descargar los incendios antes del AJAX beginRequest ... Puede que tenga que encontrar una forma de cambiar el valor del marcador mediante el enlace del hipervínculo antes de los incendios antes de la descarga.
Hice algo como esto:
dentro de la etiqueta del cuerpo:
var allowConfirm = true;
window.onbeforeunload = confirmExit;
function confirmExit()
{
if(allowConfirm)
return "Are you sure you want to navigate away from this page?";
else
allowConfirm = true;
}
Cuando salgo, llamo a este script:
allowConfirm = false; return window.location.href;
Si desea activar su devolución de datos por un hipervínculo, existe una solución alternativa: en lugar de
<a href="javascript:submitFunction();">Submit</a>
o
<a href="javascript:;" onclick="submitFunction();">Submit</a>
solo usa este código:
<a href="#" onclick="submitFunction();">Submit</a>
Parece que IE desencadena el evento onbeforeunload si el contenido del atributo href de un hipervínculo no es la página actual (que indica el carácter nítido).
Esto realmente funciona:
OnClientClick="eval(this.href);return false"
Una solución a este problema es llamar a submitFunction () en el evento click de la etiqueta de hipervínculo utilizando jquery y eliminar el atributo href del hipervínculo.
eso no es posible, no hay manera de averiguar si se presionó el botón de actualización del navegador.
En el caso de IE6 o href puede conectar la función de devolución de datos. es decir: si la función de devolución de datos es WebForm_DoPostBackWithOptions
y utiliza Jquery, agregue este código a continuación al código anterior
var DoPostBackWithOptionsHook = null;
$(document).ready(function(){
DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions;
WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook;
}
function WebForm_DoPostBackWithOptionsHook(options) {
var navigateAwayFlag = $("input[id*=''navigateAwayValue'']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "false"; }
return DoPostBackWithOptionsHook(options)
}
No está usando AJAX, pero aún así quería evitar que la página se quede sin cambios. Intenté la mayoría de las sugerencias anteriores, incluido navigateAway. Ninguno de ellos funcionaba con IE 8. NavigateAway siempre devolvía una longitud de 0.
Encontré un blog que tenía una solución sobre el uso de la clase como ID en la etiqueta y luego establecer Boolean en función de eso. Intenté eso, pero no funciona porque .NET cuando saca el HTML estaba envolviendo la etiqueta de entrada en una etiqueta span con la clase declarada en ella. Mi solución final fue poner la palabra Ignorar en el nombre de ID de la etiqueta. Además, para evitar que se llame antes de que se llame antes de que el código atrape el clic que establece el Booleano, se debe usar, como asp: Button o asp: Input. Finalmente, asp forces (de VS IDE) hace que el nombre de partida sea el tipo de control; ID = "Button_Save". Usar etiquetas asp: también previene que antes de que se descargue se llame dos veces.
<script type="text/javascript" language="javascript">
var stuffchanged = false
var ignorenavigate = false
$(document).ready(function () {
//Detect whether the event source has "nonavigate" class specified
$("a,input,img,checkbox,button").click(function () {
var str = $(this).attr("ID");
ignorenavigate = str.search("Ignore") > 0;
});
});
window.onbeforeunload = confirmExit;
function confirmExit() {
if (stuffchanged && !ignorenavigate) {
return "You have attempted to leave this page with unsaved changes. If you have made any changes to the fields without " +
"clicking the Save button, your changes will be lost. Are you sure you want to exit this page?";
}
}
function textchanged() {
stuffchanged = true;
}