2009-12-11 15 views
64

Ho un piccolo problema. Sto tentando di catturare l'evento OnUnLoad della finestra e di porre una domanda di conferma e se l'utente decide di voler rimanere, quindi va bene, e se vogliono lasciare la pagina, perderanno tutti i dati non salvati. Ecco i problemi ...jQuery UI Dialog OnBeforeUnload

Sto usando una finestra di dialogo dell'interfaccia utente jQuery e quando inserisco il seguente codice sulla mia pagina, ho aperto la finestra di dialogo, e quando faccio clic sul pulsante Indietro sul browser, non si apre mai il msgbox. E 'appena aggiorna la pagina:

<script type="text/javascript"> 
    $(window).bind('beforeunload', function() { 
      alert('you are an idiot!'); 
     } 
    ); 
</script> 

E la soluzione che sto usando è stato un post here. Di nuovo, msgbox verrà visualizzato correttamente se non ho la finestra di dialogo dell'interfaccia utente jQuery aperta. Se lo faccio, quindi non visualizza il msgbox e semplicemente aggiorna la pagina.

Qualche idea?

+1

Quale browser stai usando? L'evento 'onbeforeunload' non è specificato negli standard w3, quindi alcuni browser che sono standard-strict non lo supportano. L'esempio ben noto è Opera. – BalusC

+0

IE8, e l'ho provato in modalità Compatibilità e non ha funzionato neanche ... – Keith

+0

come posso aggiungere un qualificatore a questo? Voglio che questo messaggio mostri solo se l'utente ha apportato alcune modifiche al testo della pagina. – Nicholas

risposta

111

Il modo corretto di visualizzare l'avviso è di restituire semplicemente una stringa. Non chiamare da soli il metodo alert().

<script type="text/javascript"> 
    $(window).on('beforeunload', function() { 
     if (iWantTo) { 
      return 'you are an idiot!'; 
     } 
    }); 
</script> 

Consulta anche: https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload

+1

Quindi, se io sto restituendo una stringa, come faccio a dire se hanno detto Ok o Annulla? o importa? In realtà voglio una conferma ('sei un idiota?'); e quindi catturare quale risultato hanno scelto. Hai qualche idea su dove vorrei iniziare? – Keith

+4

Se fanno clic su Annulla, rimangono nella pagina. Se fanno clic su OK, lasciano la pagina. –

+0

Ma leggi il mio problema attuale. Funziona bene se la finestra di dialogo jQuery non è aperta. Se è aperto, la conferma non viene visualizzata e la pagina si aggiorna solo ... – Keith

14

questo funziona per me

$(window).bind('beforeunload', function() { 
     return 'Do you really want to leave?' ; 
}); 
1

jQuery API in particolare non dice per l'associazione a beforeunload, e invece dovrebbe legarsi direttamente al window.onbeforeunload, ho appena eseguito attraverso una memoria piuttosto brutta in parte a causa del binding a beforeunload con jQuery.

+16

Dovresti collegare il tuo riferimento a questa risposta, darebbe alle persone un posto dove iniziare a scavare più a fondo nel problema. –

+6

Per quanto posso vedere, la documentazione di jQuery dice semplicemente: L'evento beforeunload è supportato cross-browser in jQuery 1.5 .1 e 1.6+, ma non è supportato in IE per jQuery 1.5.2 a causa di una regressione. – StriplingWarrior

+11

-1 perché nessuna origine/riferimento è stato collegato per "l'API jQuery ..". –

43

È possibile anche fare un'eccezione per lasciare la pagina tramite la presentazione di una forma particolare:

$(window).bind('beforeunload', function(){ 
    return "Do you really want to leave now?"; 
}); 

$("#form_id").submit(function(){ 
    $(window).unbind("beforeunload"); 
}); 
1

questo funziona per me:

window.addEventListener("beforeunload", function(event) { 
 
    event.returnValue = "You may have unsaved Data"; 
 
});

0

per ASP.NET MVC se vuoi fare un'eccezione per uscire dalla pagina inviando un modulo particolare:

impostare un modulo ID:

@using (Html.BeginForm("Create", "MgtJob", FormMethod.Post, new { id = "createjob" })) 
{ 
    // Your code 
} 



<script type="text/javascript"> 

    // Without submit form 
    $(window).bind('beforeunload', function() { 
     if ($('input').val() !== '') { 
      return "It looks like you have input you haven't submitted." 
     } 
    }); 

    // this will call before submit; and it will unbind beforeunload 
    $(function() { 
     $("#createjob").submit(function (event) { 
      $(window).unbind("beforeunload"); 
     }); 
    }); 

</script> 
Problemi correlati