Estou tentando capturar o pressionamento do botão enviar do meu formulário e, se o formulário for enviado, a página é atualizada e eu mostro alguns campos ocultos. Eu gostaria de capturar se o formulário foi enviado antes ou não e se ele foi enviado no recarregamento, eu gostaria de reexibir os campos ocultos. Eu estava tentando usar uma variável global para fazer isso, mas não consegui fazê-la funcionar corretamente.
Aqui está o que eu tentei:
var clicked = false;
$(document).ready(function() {
$("input[type='submit'][value='Search']").attr("onclick", "form.act.value='detailSearch'; clicked = true; return true;");
if (clicked == true) {
// show hidden fields
} else {
// don't show hidden fields
}
});
Alguma sugestão sobre o que há de errado com este código?
preventDefault
nosubmit
evento (em vez doclick
que está usando).Respostas:
Como o HTTP não tem estado, toda vez que você carregar a página, ele usará os valores iniciais de tudo o que você configurou em JavaScript. Você não pode definir uma variável global em JS e simplesmente manter esse valor após carregar a página novamente.
Existem algumas maneiras de armazenar o valor em outro lugar para que você possa inicializá-lo no carregamento usando JavaScript
String de consulta
Ao enviar um formulário usando o
GET
método, o url é atualizado com uma string de consulta (?parameter=value&something=42
). Você pode utilizar isso definindo um campo de entrada no formulário com um determinado valor. Este seria o exemplo mais simples:No carregamento inicial da página, nenhuma string de consulta é definida. Ao enviar este formulário, a combinação
name
evalue
da entrada são passadas na string de consulta comoclicked=true
. Portanto, quando a página for carregada novamente com essa string de consulta, você poderá verificar se o botão foi clicado.Para ler esses dados, você pode usar o seguinte script no carregamento da página:
( Fonte )
A capacidade de usar isso depende de como seu formulário funciona atualmente. Se você já usa um POST, isso pode ser problemático.
Além disso, para conjuntos de dados maiores, isso é menos do que ideal. Passar uma string não é grande coisa, mas para arrays e objetos de dados, você provavelmente deve usar o Web Storage ou cookies. Embora os detalhes difiram um pouco entre os navegadores, o limite prático para o comprimento do URI é de cerca de 2.000 caracteres
Armazenamento web
Com a introdução do HTML5, também obtivemos o Web Storage, que permite salvar informações no navegador durante o carregamento da página. Existe o
localStorage
que pode salvar dados por um período mais longo (desde que o usuário não os apague manualmente) esessionStorage
que salva os dados apenas durante a sua sessão de navegação atual. O último é útil para você aqui, porque você não deseja manter "clicado" definido como verdadeiro quando o usuário voltar mais tarde.Aqui eu defino o armazenamento no evento de clique do botão, mas você também pode vinculá-lo ao envio de formulário ou qualquer outra coisa.
Então, ao carregar a página, você pode verificar se ela está definida usando o seguinte:
Mesmo que esse valor seja salvo apenas durante esta sessão de navegação, pode ser possível que você queira redefini-lo antes. Para fazer isso, use:
Se você deseja salvar um objeto JS ou array, deve convertê-lo em uma string. De acordo com as especificações, deve ser possível salvar outros tipos de dados, mas isso ainda não foi implementado corretamente nos navegadores.
O suporte do navegador é muito bom, então você deve estar seguro para usá-lo, a menos que precise suportar navegadores realmente antigos / obscuros. O armazenamento na Web é o futuro.
Biscoitos
Uma alternativa ao Web Storage é salvar os dados em um cookie. Os cookies são feitos principalmente para ler dados do lado do servidor, mas também podem ser usados para dados puramente do lado do cliente.
Você já usa jQuery, o que torna a configuração de cookies bastante fácil. Novamente, eu uso o
click
evento aqui, mas poderia ser usado em qualquer lugar.Então, no carregamento da página, você pode ler o cookie assim:
Como os cookies persistem em todas as sessões no seu caso, você precisará removê-los assim que fizer o que for necessário com eles. Você não gostaria que o usuário voltasse um dia depois e ainda tivesse
clicked
definido como verdadeiro.(uma maneira não jQuery de definir / ler cookies pode ser encontrada aqui )
Eu pessoalmente não usaria um cookie para algo simples como lembrar um estado clicado, mas se a string de consulta não for uma opção e você precisar oferecer suporte a navegadores realmente antigos que não oferecem suporte a sessionStorage, isso funcionará. Você deve implementar isso com uma verificação de sessionStorage primeiro, e somente se isso falhar, use o método de cookie.
window.name
Embora isso pareça um hack para mim que provavelmente se originou antes de localStorage / sessionStorage, você pode armazenar informações na
window.name
propriedade:Ele só pode armazenar strings, portanto, se você quiser salvar um objeto, terá de transformá-lo em string como no
localStorage
exemplo acima :A principal diferença é que essas informações são retidas não apenas nas atualizações de página, mas também em diferentes domínios. No entanto, é restrito à guia atual em que você está.
Isso significa que você pode salvar algumas informações em sua página e, enquanto o usuário permanecer nessa guia, poderá acessar essas mesmas informações mesmo que ele navegue para outro site e volte. Em geral, eu desaconselho o uso disso, a menos que você realmente precise armazenar informações entre domínios durante uma única sessão de navegação.
fonte
window.name
). Ele pode fazer exatamente o que você precisa, sem usar cookies / localStorage.Tente utilizar
$.holdReady()
,history
fonte
Usar
localeStorage
ousessionStorage
parece ser a melhor aposta.Em vez de salvar a
clicked
variável no escopo global, armazene-a desta maneira:fonte
Você pode tentar isto:
fonte