Quero usar o JavaScript para ver se há histórico ou não, quero dizer, se o botão Voltar está disponível no navegador ou não.
javascript
Ryan
fonte
fonte
Respostas:
Resposta curta: você não pode.
Tecnicamente, existe uma maneira precisa, que seria verificar a propriedade:
No entanto, não vai funcionar. O problema é que, na maioria dos navegadores, isso é considerado uma violação de segurança e geralmente apenas retorna indefinido .
É uma propriedade que outras pessoas sugeriram ...
No entanto , o comprimento não funciona completamente porque não indica onde você está na história. Além disso, nem sempre começa no mesmo número. Um navegador não configurado para ter uma página de destino, por exemplo, inicia em 0, enquanto outro navegador que usa uma página de destino inicia em 1.
Na maioria das vezes, é adicionado um link que chama:
ou
e espera-se que, se você não puder voltar, clicar no link não faça nada.
fonte
Há outra maneira de verificar - verifique o referenciador. A primeira página geralmente terá um referenciador vazio ...
fonte
Meu código permite que o navegador volte uma página e, se isso falhar, ele carrega um URL de fallback. Ele também detecta alterações de hashtags.
Quando o botão Voltar não estava disponível, o URL de fallback será carregado após 500 ms, para que o navegador tenha tempo suficiente para carregar a página anterior. Carregar o URL de fallback logo em seguida
window.history.go(-1);
faria com que o navegador usasse o URL de fallback, porque o script js ainda não parava.fonte
chrome://newtab
e, portanto, pode voltar no histórico.Aqui está como eu fiz isso.
Eu usei o evento 'beforeunload' para definir um booleano. Em seguida, defino um tempo limite para observar se o 'beforeload' foi acionado.
Parece funcionar nos principais navegadores (FF, Chrome, IE11 testados até agora).
fonte
window.location.href = fallback
comwindow.close()
e funciona também.Há um trecho que eu uso nos meus projetos:
FYI: Eu uso o History.js para gerenciar o histórico do navegador.
Por que comparar history.length ao número 2?
Porque a página inicial do Chrome é contada como o primeiro item no histórico do navegador.
Existem poucas possibilidades
history.length
e comportamento do usuário:history.length = 2
e queremos desativarback()
nesse caso, porque o usuário irá para a guia vazia.history.length = 1
e novamente queremos desativar oback()
método.history.length > 2
e agoraback()
pode ser ativado.Nota: eu omito o caso quando o usuário chega à página atual depois de clicar no link do site externo sem
target="_blank"
.Nota 2:
document.referrer
está vazia quando você abre o site digitando seu endereço e também quando o site usa ajax para carregar subpáginas, então descontinuei a verificação desse valor no primeiro caso.fonte
isso parece fazer o truque:
Chame history.back () e depois window.close (). Se o navegador puder voltar ao histórico, não poderá acessar a próxima declaração. Se não conseguir voltar, fechará a janela.
No entanto, observe que se a página foi acessada digitando um URL, o Firefox não permitirá que o script feche a janela.
fonte
window.close()
é considerado um risco de segurança por muitos navegadores modernos. Alguns simplesmente não deixam você fazer isso.Tenha cuidado
window.history.length
porque inclui também entradas parawindow.history.forward()
Talvez você tenha
window.history.length
mais de uma entrada, mas nenhuma entrada de histórico. Isso significa que nada acontece se você dispararwindow.history.back()
fonte
Você não pode verificar diretamente se o botão Voltar é utilizável. Você pode ver
history.length>0
, mas isso será válido se houver páginas à frente da página atual também. Você só pode ter certeza de que o botão Voltar não pode ser usado quandohistory.length===0
.Se isso não for suficiente, basta ligar
history.back()
e, se sua página ainda for carregada depois, o botão Voltar não estará disponível! Claro que isso significa que, se o botão Voltar estiver disponível, você acabou de navegar para fora da página. Você não tem permissão para cancelar a navegaçãoonunload
. Portanto, tudo o que você pode fazer para impedir que as coisas realmente ocorram é retornar algoonbeforeunload
, o que resultará em um grande e irritante aviso. Não vale a pena.De fato, normalmente é uma péssima idéia fazer algo com a história. A navegação no histórico é para o navegador chrome, não para páginas da web. Adicionar links de retorno geralmente causa mais confusão do usuário do que vale a pena.
fonte
1
! O0
foi um brainfart, pensei navegadores sempre responder com1
ou mais. Acontece que o Opera e o IE pensam o contrário - uma boa captura.history.length
é inútil, pois não mostra se o usuário pode voltar no histórico. Também diferentes navegadores usam valores iniciais 0 ou 1 - isso depende do navegador.A solução de trabalho é usar
$(window).on('beforeunload'
event, mas não tenho certeza se funcionará se a página for carregada via ajax e usar pushState para alterar o histórico da janela.Então, eu usei a próxima solução:
fonte
Eu vim com a seguinte abordagem. Ele utiliza o evento onbeforeunload para detectar se o navegador começa a sair da página ou não. Caso contrário, ele será redirecionado apenas para o fallback.
Você pode chamar esta função usando
goBack("fallback.example.org")
.fonte
windows.onbeforeunload
para ouvinte de eventoswindow.addEventListener("beforeunload", function (event) { useFallback = false; });
para que não sobrescreva window.onbeforeunload.Com base na resposta aqui e aqui . Penso que a resposta mais conclusiva é apenas verificar se esta é uma nova página em uma nova guia.
Se o histórico da página for mais de um, podemos voltar à página anterior à página atual. Caso contrário, a guia é uma guia recém-aberta e precisamos criar uma nova guia.
Diferentemente, para as respostas vinculadas, não estamos verificando uma,
referrer
pois uma nova guia ainda terá um referenciador.fonte
Existe outra solução quase perfeita, extraída de outra resposta do SO :
Alguém relatou que não funciona ao usar,
target="_blank"
mas parece funcionar para mim no Chrome.fonte
o navegador tem o botão voltar e avançar. Eu venho uma solução sobre esta questão. mas Isso afetará a ação de encaminhamento do navegador e causará erros em alguns navegadores.
Funciona assim: se o navegador abrir um novo URL, que nunca foi aberto, o history.length aumentará.
para que você possa alterar o hash como
Para obter um URL nunca mostrado, o history.length terá o tamanho real.
mas nem sempre funciona bem e não sei por que, especialmente quando o URL automático salta rapidamente.
fonte
Eu estava tentando encontrar uma solução e isso é o melhor que pude obter (mas funciona muito bem e é a solução mais fácil que encontrei aqui).
No meu caso, eu queria voltar ao histórico com um botão Voltar, mas se a primeira página aberta pelo usuário fosse uma subpágina do meu aplicativo, ele retornaria à página principal.
A solução foi que, assim que o aplicativo foi carregado, substituí o estado do histórico:
Dessa forma, eu só preciso verificar
history.state.root
antes de voltar. Se for verdade, substituo um histórico:fonte
fonte
history.back()
éundefined
apenas na página da guia vaziaSolução
Explicação
window.location.pathname
fornecerá o URI atual. Por exemplohttps://domain/question/1234/i-have-a-problem
, dará/question/1234/i-have-a-problem
. Veja a documentação sobre window.location para mais informações.Em seguida, a chamada para
split()
nos fornecerá todos os fragmentos desse URI. portanto, se usarmos nosso URI anterior, teremos algo parecido["", "question", "1234", "i-have-a-problem"]
. Consulte a documentação sobre String.prototype.split () para obter mais informações.A chamada para
filter()
está aqui para filtrar a sequência vazia gerada pela barra invertida. Basicamente, ele retornará apenas o URI do fragmento que tenha um comprimento maior que 1 (sequência não vazia). Então teríamos algo parecido["question", "1234", "i-have-a-question"]
. Isso poderia ter sido escrito assim:Consulte a documentação sobre Array.prototype.filter () e a atribuição Destructuring para obter mais informações.
Agora, se o usuário tentar voltar enquanto estiver ligado
https://domain/
, não acionaremos a instrução if e, portanto, não acionaremos owindow.history.back()
método para que o usuário permaneça em nosso site. Esse URL será equivalente ao[]
comprimento0
e0 > 0
é falso. Portanto, falhando silenciosamente. Obviamente, você pode registrar algo ou executar outra ação, se desejar.Limitações
Obviamente, essa solução não funcionará se o navegador não suportar a API do histórico . Verifique a documentação para saber mais sobre isso antes de usar esta solução.
fonte
Não tenho certeza se isso funciona e é completamente não testado, mas tente o seguinte:
E em algum lugar no HTML:
EDITAR:
O que você também pode fazer é pesquisar quais navegadores suportam a função back (acho que todos funcionam) e usar o objeto de detecção de navegador JavaScript padrão encontrado e descrito detalhadamente nesta página . Em seguida, você pode ter 2 páginas diferentes: uma para os "bons navegadores" compatível com o botão Voltar e outra para os "navegadores ruins", solicitando a atualização do navegador.
fonte
history.back
é uma função. Você deseja verificar se,history.length > 0
então, se voltar comhistory.back()
[]
em um NodeList não faz sentido, e você não pode atribuir uma string a um manipulador de eventos.Verifique se
window.history.length
é igual a 0.fonte