Temos algumas páginas usando ajax para carregar conteúdo e há algumas ocasiões em que precisamos criar um link direto para uma página. Em vez de ter um link para "Usuários" e pedir às pessoas para clicarem em "configurações", é útil poder vincular as pessoas às configurações user.aspx #
Para permitir que as pessoas nos forneçam links corretos para as seções (para suporte técnico etc.), eu o configurei para modificar automaticamente o hash no URL sempre que um botão for clicado. O único problema é que, quando isso acontece, ela também rola a página para esse elemento.
Existe uma maneira de desativar isto? Abaixo está como eu estou fazendo isso até agora.
$(function(){
//This emulates a click on the correct button on page load
if(document.location.hash){
$("#buttons li a").removeClass('selected');
s=$(document.location.hash).addClass('selected').attr("href").replace("javascript:","");
eval(s);
}
//Click a button to change the hash
$("#buttons li a").click(function(){
$("#buttons li a").removeClass('selected');
$(this).addClass('selected');
document.location.hash=$(this).attr("id")
//return false;
});
});
Eu esperava que return false;
isso impedisse a rolagem da página - mas apenas faz com que o link não funcione. Então, isso foi comentado por enquanto, para que eu possa navegar.
Alguma ideia?
Use
history.replaceState
ouhistory.pushState
* para alterar o hash. Isso não acionará o salto para o elemento associado.Exemplo
Demo no JSFiddle
* Se você deseja obter histórico e suporte para trás
Comportamento histórico
Se você estiver usando
history.pushState
e não desejar rolar a página quando o usuário usar os botões de histórico do navegador (avançar / retroceder), confira ascrollRestoration
configuração experimental (somente Chrome 46+) .Suporte do navegador
fonte
replaceState
é provavelmente o melhor caminho a percorrer aqui. A diferença épushState
adicionar um item ao seu histórico, enquantoreplaceState
isso não acontece.body
que rola, às vezes é odocumentElement
. Veja esta essência por Diego PeriniAcho que encontrei uma solução bastante simples. O problema é que o hash no URL também é um elemento na página na qual você é rolado. se eu apenas acrescentar algum texto ao hash, agora ele não fará mais referência a um elemento existente!
Agora, o URL aparece como
page.aspx#btn_elementID
não sendo um ID real na página. Acabei de remover "btn_" e obtenho o ID do elemento realfonte
/
parece lógico.Um trecho do seu código original:
Mude para:
fonte
hash
propriedade fará com que a página role de qualquer maneira.Recentemente, eu estava construindo um carrossel que conta com
window.location.hash
a manutenção do estado e descobri que os navegadores Chrome e Webkit forçariam a rolagem (mesmo para um destino não visível) com um empurrão estranho quando owindow.onhashchange
evento for disparado.Mesmo tentando registrar um manipulador que interrompe a propagação:
Não fez nada para interromper o comportamento padrão do navegador. A solução que encontrei foi usar
window.history.pushState
para alterar o hash sem disparar os efeitos colaterais indesejáveis.Você pode ouvir o evento normal de troca de hash e
my.hashchange
:fonte
my.hashchange
é claro que é apenas um exemplo de nome de eventoOk, este é um tópico bastante antigo, mas eu pensei em entrar em contato porque a resposta 'correta' não funciona bem com CSS.
Essa solução basicamente impede que o evento click mova a página para que possamos obter a posição de rolagem primeiro. Em seguida, adicionamos manualmente o hash e o navegador aciona automaticamente um evento de alteração de hash . Capturamos o evento hashchange e voltamos para a posição correta. Um retorno de chamada separa e evita que seu código cause um atraso, mantendo o hash hacking em um só lugar.
fonte
Erm, eu tenho um método um tanto grosseiro, mas definitivamente funcional.
Apenas armazene a posição atual de rolagem em uma variável temp e, em seguida, redefina-a após alterar o hash. :)
Então, para o exemplo original:
fonte
Eu não acho que isso seja possível. Até onde eu sei, a única vez em que um navegador não rola para uma alteração
document.location.hash
é se o hash não existir na página.Este artigo não está diretamente relacionado à sua pergunta, mas discute o comportamento típico do navegador de alterar
document.location.hash
fonte
se você usar o evento hashchange com o analisador de hash, poderá impedir a ação padrão nos links e alterar location.hash adicionando um caractere para ter diferença na propriedade id de um elemento
fonte
Adicionando isso aqui, porque as perguntas mais relevantes foram todas marcadas como duplicatas, apontando aqui…
Minha situação é mais simples:
a[href='#something']
)e.preventDefault()
$("html,body").stop(true,true).animate({ "scrollTop": linkoffset.top }, scrollspeed, "swing" );
window.location = link;
Dessa forma, a rolagem ocorre e não há salto quando a localização é atualizada.
fonte
A outra maneira de fazer isso é adicionar uma div que está oculta na parte superior da janela de exibição. Essa div recebe o ID do hash antes que o hash seja adicionado ao URL .... para que você não obtenha um pergaminho.
fonte
Aqui está minha solução para guias habilitadas para histórico:
E para mostrar a última guia selecionada:
Observe o
*=
nafilter
chamada. Isso é específico da jQuery e, sem ela, as guias ativadas para o histórico falharão.fonte
Esta solução cria uma div no scrollTop real e a remove após alterar o hash:
opcional, acionando o evento âncora no carregamento da página:
fonte
Eu tenho um método mais simples que funciona para mim. Basicamente, lembre-se do que realmente é o hash em HTML. É um link de âncora para uma tag Name. É por isso que rola ... o navegador está tentando rolar para um link de ancoragem. Então, dê um!
Nomeie sua seção divs com classes em vez de IDs.
No seu código de processamento, retire a marca de hash e substitua por um ponto:
Por fim, remova element.preventDefault ou return: false e permita que a navegação aconteça. A janela permanecerá na parte superior, o hash será anexado ao URL da barra de endereço e o painel correto será aberto.
fonte
Eu acho que você precisa redefinir a rolagem para sua posição antes da alteração de hash.
fonte
Se em sua página você usa o id como uma espécie de ponto de ancoragem e tem cenários em que deseja que os usuários anexem #something ao final do URL e faça a rolagem da página para a seção #something usando seu próprio conjunto animado definido função javascript, o ouvinte de evento hashchange não poderá fazer isso.
Se você simplesmente colocar um depurador imediatamente após o evento hashchange, por exemplo, algo como isto (bem, eu uso o jquery, mas você entendeu):
Você notará que, assim que você altera o URL e pressiona o botão Enter, a página para na seção correspondente imediatamente; somente depois disso, sua própria função de rolagem definida será acionada e meio que rola para a seção, que parece muito mal.
Minha sugestão é:
não use id como ponto de ancoragem para a seção para a qual você deseja rolar.
Se você deve usar o ID, como eu. Em vez disso, use o ouvinte de evento 'popstate', ele não irá rolar automaticamente até a seção que você anexa ao URL; em vez disso, você pode chamar sua própria função definida dentro do evento popstate.
$(window).on('popstate', function(){myscrollfunction()});
Finalmente, você precisa fazer um pequeno truque em sua própria função de rolagem definida:
exclua o ID da sua tag e redefina-o.
Isso deve fazer o truque.
fonte
Adicione este código apenas ao jQuery em documentos prontos
Ref: http://css-tricks.com/snippets/jquery/smooth-scrolling/
fonte