2009-05-29 498 views
20

Quello che sto cercando di ottenere è di avvisare l'utente delle modifiche non salvate se tenta di chiudere una pagina o di spostarsi da essa senza salvare prima.Attivazione di ONBeforeUnload SOLO quando i valori dei campi sono cambiati

Sono riuscito a visualizzare la finestra di dialogo OnBeforeUnload() ... ma non voglio che venga visualizzata affatto se l'utente non ha modificato alcun valore di campo. Per questo, sto utilizzando questo campo di input nascosto chiamato is_modified che inizia con un valore predefinito di false e passa a true quando un campo è modificato.

Ho tentato di associare l'evento a in questo campo is_modified per provare a rilevare la modifica del valore ... e solo dopo attivare OnBeforeUnload.

$('#is_modified').change(function() { 
    if($('#is_modified').val() == 'true') 
     window.onbeforeunload = function() { return "You have unsaved changes."; } 
}); 

Ma da quello che ho dato è che l'evento change() funziona solo dopo questi 3 punti - un campo riceve il focus, un valore non è cambiato e il campo perde concentrarsi. Nel caso del campo di input nascosto, non sono sicuro di come questa parte di focus ricevente e perdente funzioni! Quindi, la funzione onbeforeunload non viene mai attivata.

Qualcuno può suggerire un modo per mantenere un trigger su is_modified?

Grazie.

risposta

1

Prova la tua logica in un modo diverso. Significa, metti la logica per controllare il valore del campo di input nel tuo metodo onbeforeunload.

window.onbeforeunload = function() { 
    if ($("#is_modified").val() == 'true') { 
     return "You have unsaved changes."; 
    } else { 
     return true; // I think true is the proper value here 
    } 
}; 
+1

"true" non è il valore corretto. In alcuni browser (almeno Firefox, forse più) restituendo "null" si annulla la finestra di dialogo. Howerver, in IE, non sono riuscito a trovare un modo per cancellare la finestra di dialogo dall'interno del gestore. L'unica cosa che ha funzionato per me è stato di rimuovere completamente il gestore (cioè "window.beforeunload = null"), come nella risposta di Bryan Larsen. –

+0

Abbastanza giusto. Purtroppo, non ho provato a fondo la mia soluzione prima di rispondere. :( –

+5

So di essere un po 'in ritardo alla festa, ma ero solo in esecuzione in questo. Tuttavia in IE, se la funzione restituisce 'undefined' (o non restituisce nulla), la finestra di dialogo non mostra (questa funziona anche in FF). ho provato a tornare true/false/null e IE sarebbe solo mettere "true"/"false"/"null", come il testo nella finestra di dialogo. Nessuna idea perché. Spero che questo aiuta a qualcun altro. –

0

perché non hanno la chiamata onbeforeunload una funzione che controlla se i valori sono cambiati, e in tal caso restituire i "modifiche non salvate" confermare?

7

Utilizziamo solo Window.onbeforeunload come flag "modificato". Ecco quello che stiamo facendo, (utilizzando lowpro):

Event.addBehavior({ 
    "input[type=radio]:change,input[type=text]:change,input[type=checkbox]:change,select:change": function(ev) { 
     window.onbeforeunload = confirmLeave; 
    } 
    ".button.submit-button:click": function(ev) { 
     window.onbeforeunload = null; 
    }, 
}); 


function confirmLeave(){ 
    return "Changes to this form have not been saved. If you leave, your changes will be lost." 
} 
+1

impostazione Apparentemente 'onbeforeunload = null' fallisce in IE: http://bustedmug.blogspot.com/2007/01/onbeforeunload-ie7-assigning-event.html –

+0

sembra questo è un IE7 -solo bug - funziona perfettamente in IE8, che è tutto ciò che devo supportare, per fortuna! –

0

in IE9 è possibile utilizzare istruzione return semplice (ri) che non visualizzare qualsiasi finestra di dialogo. felice di codifica ..

29

ho avuto un requisito analogo così si avvicinò con seguente script jQuery:

$(document).ready(function() { 
    needToConfirm = false; 
    window.onbeforeunload = askConfirm; 
}); 

function askConfirm() { 
    if (needToConfirm) { 
     // Put your custom message here 
     return "Your unsaved data will be lost."; 
    } 
} 

$("select,input,textarea").change(function() { 
    needToConfirm = true; 
}); 

Il codice di cui sopra controlla la variabile needToConfirm, se true allora verrà visualizzato un messaggio di avviso. Ogniqualvolta il valore input, select o textarea viene modificato, la variabile needToConfirm è impostata su true.


PS: Firefox> 4 non consentono messaggio personalizzato per onbeforeunload.
Riferimento: https://bugzilla.mozilla.org/show_bug.cgi?id=588292


UPDATE: Se siete un freak prestazioni, amerete @KyleMit's suggerimento. Ha scritto un'estensione jQuery only() che verrà eseguita una sola volta per qualsiasi elemento.

$.fn.only = function (events, callback) { 
    //The handler is executed at most once for all elements for all event types. 
    var $this = $(this).on(events, myCallback); 
    function myCallback(e) { 
     $this.off(events, myCallback); 
     callback.call(this, e); 
    } 
    return this 
};  

$(":input").only('change', function() { 
    needToConfirm = true; 
}); 
+0

Funziona come un incantesimo. Ma c'è un piccolo problema: non riesco a far cambiare il messaggio. proprio messaggio come: "Sei pazzo che vuoi andare via?" ma non riuscivo a farlo funzionare ... – marianobianchi

+0

@marianobianchi: ho aggiornato la mia risposta. – xyz

+0

Grazie per la risposta, ma ho scoperto che il problema era un altro. Sto usando Firefox e c'è una funzione che non lascia cambiare questo messaggio. Ho provato in cromo e ha funzionato, ma non funziona in Firefox ... – marianobianchi

5

I seguenti funziona bene in jQuery:

var needToConfirm = false; 

$("input,textarea").on("input", function() { 
    needToConfirm = true; 
}); 

$("select").change(function() { 
    needToConfirm = true; 
}); 

window.onbeforeunload = function(){   
    if(needToConfirm) { 
    return "If you exit this page, your unsaved changes will be lost.";   
    } 
} 

E se l'utente sta inviando un modulo per salvare le modifiche, si potrebbe desiderare di aggiungere questo (cambio #mainForm alla ID della forma che 're la presentazione):

$("#mainForm").submit(function() { 
    needToConfirm = false; 
}); 
2
$(window).bind('beforeunload',function() { 
return "'Are you sure you want to leave the page. All data will be lost!"; 
}); 

$('#a_exit').live('click',function() { 
    $(window).unbind('beforeunload'); 
}); 

Sopra funziona per me.

Problemi correlati