Como desativar o botão VOLTAR do navegador (entre os navegadores)?
Como desativar o botão VOLTAR do navegador (entre os navegadores)?
Respostas:
Esta questão é muito semelhante a este um ...
Você precisa forçar a expiração do cache para que isso funcione. Coloque o código a seguir no código da sua página.
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
Não desative o comportamento esperado do navegador.
Faça suas páginas lidar com a possibilidade de os usuários voltarem uma ou duas páginas; não tente prejudicar seu software.
Eu vim com um pequeno hack que desativa o botão Voltar usando JavaScript. Eu verifiquei no Chrome 10, Firefox 3.6 e IE9:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
}
function changeHashAgain() {
window.location.href += "1";
}
var storedHash = window.location.hash;
window.setInterval(function () {
if (window.location.hash != storedHash) {
window.location.hash = storedHash;
}
}, 50);
</script>
</head>
<body onload="changeHashOnLoad(); ">
Try to hit the back button!
</body>
</html>
O que isso está fazendo?
Dos comentários:
Este script aproveita o fato de que os navegadores consideram tudo o que vem depois do sinal "#" no URL como parte do histórico de navegação. O que faz é o seguinte: quando a página carrega, "# 1" é adicionado ao URL. Após 50ms, o "1" é removido. Quando o usuário clica em "voltar", o navegador muda a URL de volta para o que era antes de o "1" ser removido, MAS - é a mesma página da web, então o navegador não precisa recarregar a página. - Yossi Shasho
Outros adotaram a abordagem de dizer "não faça isso", mas isso não responde realmente à pergunta do autor da postagem. Vamos supor que todos saibam que é uma má ideia, mas estamos curiosos para saber como isso é feito ...
Você não pode desabilitar o botão Voltar no navegador de um usuário, mas pode fazer com que seu aplicativo seja interrompido (exibe uma mensagem de erro, exigindo que o usuário reinicie) se o usuário voltar.
Uma abordagem que vi para fazer isso é passar um token em cada URL dentro do aplicativo e em cada formulário. O token é gerado novamente em cada página e, assim que o usuário carrega uma nova página, todos os tokens das páginas anteriores são invalidados.
Quando o usuário carrega uma página, a página só será exibida se o token correto (que foi fornecido para todos os links / formulários na página anterior) foi passado para ela.
O aplicativo de banco on-line que meu banco oferece é assim. Se você usar o botão Voltar, nenhum link funcionará e nenhum recarregamento de página poderá ser feito - em vez disso, você verá um aviso informando que não é possível voltar atrás e é necessário reiniciar.
Embora eu mesmo esteja procurando pela resposta, "Melhores práticas" está ... desatualizado ... Assim como os navegadores estão. (Na verdade, navegadores são fósseis feios)
A solução melhor / mais segura seria que os navegadores implementassem um método / solicitação em que o usuário pudesse conceder à página a capacidade de controlar a interface.
Por quê? Porque para o meu projeto atual estou construindo uma interface 100% JavaScript construída e controlada. E o botão Voltar não tem lugar no meu projeto, pois não há mudança de página. (Ou seja, muito rápido e sem flashes de página por causa de uma atualização .. Assim como um aplicativo real!)
Eu sei por que a capacidade de "roubar" a interface não está lá, e eu entendo. Mas, pelo menos, devemos ter a capacidade de solicitá-lo do navegador! Isso seria realmente a "melhor prática" sem os perigos do roubo.
Mas os navegadores são navegadores ... Não espero que nada de interessante aconteça a esse respeito.
Eu estava procurando a mesma pergunta e encontrei o seguinte código em um site. Pensei em compartilhá-lo aqui:
function noBack()
{
window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }
No entanto, conforme observado pelos usuários acima, esta nunca é uma boa prática e deve ser evitada por todos os motivos.
Se você confiar na tecnologia do cliente, ela pode ser contornada. Javascript pode ser desativado, por exemplo. Ou o usuário pode executar um script JS para contornar suas restrições.
Meu palpite é que você só pode fazer isso rastreando a sessão do usuário do lado do servidor e redirecionando (como em Server.Transfer, não em Response.Redirect) o usuário / navegador para a página necessária.
Houve algumas implementações diferentes. Existe uma solução flash e algumas soluções iframe / frame para o IE. Veja isso
BTW: Existem muitos motivos válidos para desativar (ou pelo menos evitar 1 etapa) um botão Voltar - veja o gmail como um exemplo que implementa a solução hash discutida no artigo acima.
Pesquise no Google "como o Ajax quebrou o botão Voltar" e você encontrará muitos artigos sobre testes de usuários e a validade de desativar o botão Voltar.
Eu também tive o mesmo problema, use essa função de script Java na tag head ou no, está 100% funcionando bem, não deixava você voltar.
<script type = "text/javascript" >
function preventBack(){window.history.forward();}
setTimeout("preventBack()", 0);
window.onunload=function(){null};
</script>
Experimente este código. Funcionou para mim. Basicamente, ele muda o hash assim que a página é carregada, o que muda a página de histórico recente adicionando "1" no URL. Então, quando você clica no botão Voltar, ele redireciona para a mesma página todas as vezes.
<script type="text/javascript">
var storedHash = window.location.hash;
function changeHashOnLoad() { window.location.hash = "1";}
window.onhashchange = function () {
window.location.hash = storedHash;
}
</script>
<body onload="changeHashOnLoad(); ">
</bod>
Você deve usar postagens com vencimentos adequados e cabeçalhos de cache.
Em vez de tentar desativar o botão Voltar do navegador, é melhor suportá-lo. .NET 3.5 pode muito bem lidar com os botões voltar (e avançar) do navegador. Pesquise no Google: "Scriptmanager EnableHistory". Você pode controlar quais ações do usuário adicionarão uma entrada ao histórico do navegador (ScriptManager -> AddHistoryPoint) e seu aplicativo ASP.NET receberá um evento sempre que o usuário clicar nos botões Voltar / Avançar do navegador. Isso funcionará para todos os navegadores conhecidos
Globalmente, desativar o botão Voltar é de fato uma prática ruim. Mas, em certas situações, a funcionalidade do botão Voltar não faz sentido.
Esta é uma maneira de evitar a navegação indesejada entre as páginas:
Página inicial (arquivo top.php
):
<?php
session_start();
$_SESSION[pid]++;
echo "top page $_SESSION[pid]";
echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>
Página secundária (arquivo secondary.php
):
<?php
session_start();
if ($_SESSION[pid] != $_GET[pid])
header("location: top.php");
else {
echo "secondary page $_SESSION[pid]";
echo "<BR><a href='top.php'>top</a>";
}
?>
O efeito é permitir navegar da página superior para a frente para a página secundária e voltar (por exemplo, Cancelar) usando seus próprios links. Porém, após retornar à página inicial, o botão Voltar do navegador é impedido de navegar para a página secundária.
Até eu já enfrentei a mesma situação antes ... e não tive nenhuma ajuda. tente essas coisas talvez funcionem para você
na <head>
tag da página de login :
<script type="text/javascript">
window.history.forward();
</script>
no botão Logout eu fiz isso:
protected void Btn_Logout_Click(object sender, EventArgs e)
{
connObj.Close();
Session.Abandon();
Session.RemoveAll();
Session.Clear();
HttpContext.Current.Session.Abandon();
}
e na página de login coloquei o foco na caixa de texto Nome de usuário como esta:
protected void Page_Load(object sender, EventArgs e)
{
_txtUsername.Focus();
}
Espero que isso ajude ... :) Alguém por favor me ensine como editar esta página ...
SE você precisar suprimir suavemente as teclas delete e backspace em seu aplicativo Web, de modo que quando eles estiverem editando / excluindo itens a página não seja redirecionada inesperadamente, você pode usar este código:
window.addEventListener('keydown', function(e) {
var key = e.keyCode || e.which;
if (key == 8 /*BACKSPACE*/ || key == 46/*DELETE*/) {
var len=window.location.href.length;
if(window.location.href[len-1]!='#') window.location.href += "#";
}
},false);
Experimente este código. Você só precisa implementar este código na página mestra e ele funcionará para você em todas as páginas
<script type="text/javascript">
window.onload = function () {
noBack();
}
function noBack() {
window.history.forward();
}
</script>
<body onpageshow="if (event.persisted) noBack();">
</body>
O problema com Yossi Shasho Code 's é que a página está rolando para o topo a cada 50 ms. Então, eu modifiquei esse código. Agora está funcionando bem em todos os navegadores modernos, IE8 e superior
var storedHash = window.location.hash;
function changeHashOnLoad() {
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
}
function changeHashAgain() {
window.location.href += "1";
}
function restoreHash() {
if (window.location.hash != storedHash) {
window.location.hash = storedHash;
}
}
if (window.addEventListener) {
window.addEventListener("hashchange", function () {
restoreHash();
}, false);
}
else if (window.attachEvent) {
window.attachEvent("onhashchange", function () {
restoreHash();
});
}
$(window).load(function () { changeHashOnLoad(); });