Eu tenho um requisito para implementar um prompt "Alterações não salvas" em um aplicativo ASP .Net. Se um usuário modificar os controles em um formulário da web e tentar navegar antes de salvar, um prompt deve aparecer avisando-o de que há alterações não salvas e dando-lhe a opção de cancelar e permanecer na página atual. O prompt não deve ser exibido se o usuário não tiver tocado em nenhum dos controles.
Idealmente, gostaria de implementar isso em JavaScript, mas antes de seguir o caminho de rolar meu próprio código, há alguma estrutura existente ou padrões de design recomendados para fazer isso? O ideal é algo que possa ser facilmente reutilizado em várias páginas com alterações mínimas.
javascript
asp.net
prompt
Tbreffni
fonte
fonte
Respostas:
Usando jQuery:
Combine com
onunload
/onbeforeunload
métodos conforme necessário.A partir dos comentários, o seguinte faz referência a todos os campos de entrada, sem duplicar o código:
Usar
$(":input")
refere-se a todos os elementos de entrada, área de texto, seleção e botão.fonte
change
para entradas de texto, os gatilhos são acionados uma vez ao sair / perder o foco, enquanto osinput
gatilhos para cada pressionamento de tecla. (Eu geralmente uso juntochange
com JQueryone()
, a fim de evitar vários eventos.)Uma peça do quebra-cabeça:
E outro :
Enrole tudo e o que você ganha?
Provavelmente, você também desejará alterar o registro do
beforeunload
manipulador de eventos para usarLIBRARY_OF_CHOICE
o registro de eventos de.fonte
onclick="window.onbeforeunload=null"
)Na página .aspx, você precisa de uma função Javascript para saber se as informações do formulário estão "sujas" ou não
e no code-behind, adicione os gatilhos aos campos de entrada, bem como redefina os botões de envio / cancelamento ....
fonte
O seguinte usa a função onbeforeunload do navegador e jquery para capturar qualquer evento onchange. A TI também procura por quaisquer botões enviar ou redefinir para redefinir o sinalizador, indicando que as alterações ocorreram.
fonte
Obrigado pelas respostas a todos. Acabei implementando uma solução usando JQuery e o plug-in Protect-Data . Isso me permite aplicar automaticamente o monitoramento a todos os controles em uma página.
No entanto, existem algumas ressalvas, especialmente ao lidar com um aplicativo ASP .Net:
Quando um usuário escolhe a opção cancelar, a função doPostBack lançará um erro de JavaScript. Tive que colocar manualmente um try-catch em torno da chamada .submit em doPostBack para suprimi-la.
Em algumas páginas, um usuário pode realizar uma ação que executa um postback para a mesma página, mas não é um salvamento. Isso resulta em qualquer reinicialização da lógica do JavaScript, então ele pensa que nada mudou após o postback, quando algo pode ter mudado. Tive que implementar uma caixa de texto oculta que é postada de volta com a página e é usada para conter um valor booleano simples que indica se os dados estão sujos. Isso é persistido em postbacks.
Você pode querer que alguns postbacks na página não acionem a caixa de diálogo, como o botão Salvar. Nesse caso, você pode usar JQuery para adicionar uma função OnClick que define window.onbeforeunload como null.
Espero que isso seja útil para qualquer pessoa que precise implementar algo semelhante.
fonte
Solução geral com suporte a vários formulários em uma determinada página ( basta copiar e colar em seu projeto )
Observação: esta solução é combinada com outras soluções para criar uma solução integrada geral.
Recursos:
fonte
_isDirty
variável conforme descrito por Aaron Powell. Não vi a necessidade de adicionar e remover classes do HTML em vez de variáveis no javascript.A solução a seguir funciona para protótipo (testado em FF, IE 6 e Safari). Ele usa um observador de formulário genérico (que dispara o formulário: alterado quando qualquer campo do formulário foi modificado), que você pode usar para outras coisas também.
fonte
Aqui está uma solução javascript / jquery que é simples. Ele é responsável por "desfazer" pelo usuário, é encapsulado em uma função para facilitar a aplicação e não falha no envio. Basta chamar a função e passar o ID do seu formulário.
Esta função serializa o formulário uma vez quando a página é carregada e novamente antes de o usuário sair da página. Se os dois estados do formulário forem diferentes, o prompt será mostrado.
Experimente: http://jsfiddle.net/skibulk/Ydt7Y/
fonte
Recentemente, contribuí para um plugin jQuery de código aberto chamado dirtyForms .
O plug-in é projetado para funcionar com HTML adicionado dinamicamente, suporta vários formulários, pode suportar virtualmente qualquer estrutura de diálogo, retorna ao diálogo antes de descarregar do navegador, tem uma estrutura auxiliar plugável para oferecer suporte à obtenção de status sujo de editores personalizados (um plug-in tinyMCE está incluído) , funciona em iframes e o status sujo pode ser definido ou redefinido à vontade.
https://github.com/snikch/jquery.dirtyforms
fonte
Detectar alterações de formulário usando jQuery é muito simples:
fonte
Eu expandi a sugestão de Slace acima, para incluir a maioria dos elementos editáveis e também excluir certos elementos (com um estilo CSS chamado "srSearch" aqui) de causar o sinalizador sujo a ser definido.
fonte
window.onbeforeunload = unloadPage;
fonte
Isso é exatamente o que o plugin Fleegix.js
fleegix.form.diff
(http://js.fleegix.org/plugins/form/diff ) foi criado para. Serialize o estado inicial do formulário no carregamento usandofleegix.form.toObject
(http://js.fleegix.org/ref#fleegix.form.toObject ) e salve-o em uma variável, depois compare com o estado atual usandofleegix.form.diff
ao descarregar. Fácil como uma torta.fonte
Um método , usando arrays para manter as variáveis para que as alterações possam ser rastreadas.
Aqui está um método muito simples para detectar mudanças , mas o resto não é tão elegante.
Outro método bastante simples e pequeno, do Farfetched Blog :
fonte
No IE, document.ready não funcionará corretamente, ele atualizará os valores de entrada.
portanto, precisamos vincular o evento load dentro da função document.ready que também será usada no navegador IE.
abaixo está o código que você deve colocar dentro da função document.ready.
fonte