Pergunta

Estou criando uma janela pop-up que tem um manipulador beforeunload instalado. Quando o item de menu arquivo "Close" é usado para fechar o pop-up, o manipulador beforeunload é chamado duas vezes, resultando em dois "Tem certeza de que deseja fechar esta janela?" mensagens que aparecem.

Este é um bug com o Firefox, e eu tenho href="https://bugzilla.mozilla.org/show_bug.cgi?id=531199" relatado-lo aqui , mas eu ainda gostaria de ter uma maneira de impedir que isto aconteça. Você pode pensar em uma maneira sã de detectar dupla beforeunload para evitar o problema dupla mensagem? O problema é que o Firefox não me diz qual botão na caixa de diálogo que o usuário eleito para clicar -. OK ou cancelar

Foi útil?

Solução 3

Este é definitivamente um bug FF. Eu relatei em https://bugzilla.mozilla.org/show_bug.cgi? id = 531199

Outras dicas

<script type="text/javascript">
var onBeforeUnloadFired = false;

window.onbeforeunload = function ()
{
    if (!onBeforeUnloadFired) {
        onBeforeUnloadFired = true;
        event.returnValue = "You have attempted to leave this page.  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?";
   }

   window.setTimeout("ResetOnBeforeUnloadFired()", 10);
}

function ResetOnBeforeUnloadFired() {
   onBeforeUnloadFired = false;
}    
</script>

Definir uma variável no manipulador para evitar que o diálogo chegando pela segunda vez. Use setTimeout para redefini-la depois.

A melhor solução que eu encontrei é usar uma variável global bandeira que é reposto depois de tantos milissegundos, digamos 500 (Isso garante que a função pode ser chamado novamente, mas não imediatamente após o seu aparecimento).

Veja último código em:

http: // sociais .msdn.microsoft.com / Fórum / en / sharepointinfopath / thread / 13000cd8-5c50-4260-a0d2-bc404764966d

Eu encontrei este problema no Chrome 21, Firefox 14, IE 7-9, Safari 5 (no PC).

As seguintes obras em todos esses navegadores. Se alguém remove a função window.onbeforeunload durante o evento isso vai impedir a segunda chamada. O truque consiste em redefinir a função window.onbeforeunload se o usuário decide ficar na página.

var window_on_before_unload = function(e) {
    var msg;
    // Do here what you ever you need to do
    msg = "Message for user";

    // Prevent next "window.onbeforeunload" from re-running this code.
    // Ensure that if the user decides to stay on the page that
    // this code is run the next time the user tries to leave the page.
    window.onbeforeunload = set_on_before_unload;

    // Prepare message for user
    if (msg) {
        if (/irefox\/([4-9]|1\d+)/.test(navigator.userAgent))
            alert(msg
                    + '\n\nThe next dialog will allow you to stay here or continue\nSee Firefox bug #588292');

        (e = e || window.event).returnValue = msg;
        return msg;
    }
};

// Set window.onbeforeunload to the above handler.
// @uses window_on_before_unload
// @param {Event} e
var set_on_before_unload = function(e) {
    // Initialize the handler for window.onbeforeunload.
    window.onbeforeunload = window_on_before_unload;
}

// Initialize the handler for window.onbeforeunload.
set_on_before_unload();

Criar uma variável global que é definida como verdadeira dentro do manipulador. Apenas mostrar o alerta / pop-up quando esta variável é falsa.

Eu uso o seguinte trecho para monitorar o exitcount

Quando a página é carregada o seguinte exitCount variável é inicializada

if (typeof(MTG) == 'undefined') MTG = {};
MTG.exitCount=0; 

e, no caso de descarregamento Janela

$(window).bind("beforeunload", function(){


            if (MTG.exitCount<=0) 
            {

                             //do your thing, save etc
            }   
            MTG.exitCount++;




});

Eu descobri que em vez de fazer sua própria chamada para confirmar (), basta fazer even.preventDefault (); dentro do evento beforeunload. Firefox lança o seu próprio diálogo de confirmação. Eu não tenho certeza se esta é a coisa correta / padrão de fazer, mas é assim que eles estão fazendo isso.

Eu tenho um documento abrir uma outra janela pop-up com window.open. Na janela original eu ter registrado (com jQuery) um ouvinte para "descarregar" evento como este:

var popup_window = window.open(...) 
$(popup_window).on('unload', function(event) ...

Eu vim através desta página, porque o evento foi efetivamente disparar duas vezes. O que eu encontrei é que ele não é um bug, ele dispara duas vezes, porque ele é acionado uma vez para "about: blank". Página que está sendo substituído por sua página e outro para sua página que está sendo descarregado

Tudo o que tenho a fazer é filtrar o evento que eu estou interessado em consultando o evento original:

function (event) {
   var original_url = e.originalEvent.originalTarget.URL;
   if (original_url != 'about:blank')
   {
       ... do cool things ...
   }
}

Eu não sei se isso se aplica à questão original, porque é um caso especial de uma janela abrindo outra, mas espero que ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top