Como obter a "confirmação da reapresentação do formulário" quando o utilizador tenta actualizar o navegador

Tenho uma página que não permite ao utilizador actualizar a página clicando no botão de actualização do navegador ou carregando em F5. Então eu quero simular 'resubmission do formulário' a fim de mostrar a mensagem prompt.

Alguém pode orientar - me numa abordagem para a implementar?

Existe alguma solução cross-browser disponível para isso?

Author: Gopal S Rathore, 2014-12-26

4 answers

Para actualizar sem obter a linha de comandos, a página deve ter sido obtida usando o HTTP GET

Faça com que o formulário tenha method="GET" em vez de method="POST" (e corrija os processos do servidor para trabalhar com esta mudança como apropriado)

Alternativamente cache os dados de post em uma sessão e redirecione para a página de exibição usando o código HTTP 303 imediatamente após o envio do formulário.

Se você quiser causar o prompt, faça o link que leva o Usuário para a página em um botão enviar em um formulário POST. se um usuário chega com um pedido GET tem que servi-los uma página com javascript que submete um formulário convertendo o pedido em um pedido POST.

 2
Author: Jasen, 2018-06-08 22:56:36
Como conseguiste desactivar tudo?

Para o botão Navegador, compatível com cruz por MDN:

window.onbeforeunload = function() {
  return "Data will be lost if you refresh the page. Are you sure?";
};

Para a tecla keystroke:

window.addEventListener("keyup", checkForRefresh, false);

var checkForRefresh = function(event) {
   if (event.keyCode == 116) {
        alert("Data will be lost if you refresh the page. Are you sure?");
   }
};

A tecla pode precisar de polifill para o IE8, mas eles fornecem-no nos documentos .

 0
Author: Adam, 2014-12-26 05:32:07

O que você quer é ouvir para o evento {[[1]} e lançar uma caixa de confirmação.

EDIT: desde que afirmou em comentários sobre outra resposta que precisa de suportar o Safari móvel (que não suporta beforeunload. Podias tentar uma biblioteca como a jquery.Areyoure

Por a discussão nesta página , suporta Safari móvel, embora eu próprio não a tenha usado

Note que alguns navegadores irão ignorar o texto que fornece no confirm invoca e mostra o seu texto por omissão. Existem formas mais profundas de contornar isso, mas isto irá pedir a caixa de diálogo.

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

      return confirm("Do you really want to close?"); 
});
 0
Author: DelightedD0D, 2017-05-23 11:58:56

De outras discussões:

Há duas abordagens que as pessoas costumavam usar aqui:

Método 1: Utilizar AJAX + Redirect Desta forma, você postar o seu formulário em segundo plano usando JQuery ou algo semelhante à Página 2, enquanto o usuário ainda vê a página 1 exibida. Após a publicação com sucesso, você redireciona o navegador para a Página 2.

Método 2: Post + redireccionar para self

Esta é uma técnica comum em fóruns. O formulário na Page1 publica os dados na Page2, Page2 processa os dados e faz o que precisa ser feito, e então ele faz um redirecionamento HTTP em si mesmo. Desta forma, a última "ação" de que o navegador se lembra é um simples GET na página 2, de modo que o formulário não está sendo submetido novamente em F5.

Pode consultar esta resposta: https://stackoverflow.com/a/3968038/1853444

 0
Author: Nguyen Giang, 2017-05-23 12:22:30