Eu tenho um painel deslizante configurado no meu site.
Quando terminou de animar, defini o hash da seguinte maneira
function() {
window.location.hash = id;
}
(trata-se de um retorno de chamada e id
é atribuído anteriormente).
Isso funciona bem, para permitir que o usuário adicione o painel aos favoritos e também para que a versão não JavaScript funcione.
No entanto, quando eu atualizo o hash, o navegador pula para o local. Eu acho que esse é um comportamento esperado.
Minha pergunta é: como posso evitar isso? Ou seja, como posso alterar o hash da janela, mas não fazer com que o navegador role para o elemento se o hash existir? Algum tipo event.preventDefault()
de coisa?
Estou usando o jQuery 1.4 e o plugin scrollTo .
Muito Obrigado!
Atualizar
Aqui está o código que altera o painel.
$('#something a').click(function(event) {
event.preventDefault();
var link = $(this);
var id = link[0].hash;
$('#slider').scrollTo(id, 800, {
onAfter: function() {
link.parents('li').siblings().removeClass('active');
link.parent().addClass('active');
window.location.hash = id;
}
});
});
javascript
jquery
hash
scrollto
alex
fonte
fonte
event.preventDefault()
:)Respostas:
Existe uma solução alternativa usando a API de histórico em navegadores modernos com fallback nos antigos:
Crédito vai para Lea Verou
fonte
history.replaceState
(o que, para alterações de hash, pode fazer mais sentido) para evitar a necessidade de umpopstate
ouvinte de evento.hashchange
evento. Isso era algo que eu tinha que resolver.hashchange
eventoO problema é que você está configurando window.location.hash para o atributo de ID de um elemento. É o comportamento esperado para o navegador pular para esse elemento, independentemente de você "preventDefault ()" ou não.
Uma maneira de contornar isso é prefixar o hash com um valor arbitrário da seguinte maneira:
Em seguida, tudo o que você precisa fazer é verificar o hash prefixado no carregamento da página. Como um bônus adicional, você pode até rolar suavemente até ele, agora que você está no controle do valor do hash ...
Se você precisar que isso funcione o tempo todo (e não apenas no carregamento inicial da página), você pode usar uma função para monitorar as alterações no valor do hash e pular para o elemento correto rapidamente:
fonte
Solução barata e desagradável .. Use o feio #! estilo.
Para configurá-lo:
Para ler:
Como ele não corresponde à âncora ou ao ID da página, ele não salta.
fonte
window.location.hash = '#/' + id;
e, em seguida, substituí-lo com:window.location.hash.replace(/^#\//, '#');
vai embelezar a url um pouco ->projects/#/tab1
Por que você não obtém a posição atual de rolagem, coloque-a em uma variável, atribua o hash e coloque a rolagem da página de volta para onde estava:
isso deve funcionar
fonte
Usei uma combinação da solução Attila Fulop (Lea Verou) para navegadores modernos e a solução Gavin Brock para navegadores antigos da seguinte maneira:
Conforme observado por Gavin Brock, para capturar o id de volta, você terá que tratar a string (que neste caso pode ter ou não o "!") Da seguinte maneira:
Antes disso, tentei uma solução semelhante à proposta pelo user706270, mas não funcionou bem com o Internet Explorer: como o mecanismo Javascript não é muito rápido, você pode observar o aumento e a diminuição da rolagem, o que produz um efeito visual desagradável.
fonte
Esta solução funcionou para mim.
O problema com a configuração
location.hash
é que a página passará para esse ID se for encontrada na página.O problema
window.history.pushState
é que ele adiciona uma entrada ao histórico para cada guia em que o usuário clica. Então, quando o usuário clica noback
botão, eles vão para a guia anterior. (isso pode ou não ser o que você deseja. não era o que eu queria).Para mim,
replaceState
foi a melhor opção, pois substitui apenas o histórico atual; portanto, quando o usuário clica noback
botão, eles vão para a página anterior.Confira os documentos da API do histórico no MDN.
fonte
Não tenho certeza se você pode alterar o elemento original, mas que tal mudar de usar o id attr para algo mais como data-id? Em seguida, basta ler o valor do ID de dados para o seu valor de hash e ele não irá pular.
fonte
Esta solução funcionou para mim
E meu código js completo é
fonte
Ao usar o laravel framework, tive alguns problemas com o uso de uma função route-> back (), pois ela apagou meu hash. Para manter meu hash, criei uma função simples:
e defini-o na minha outra função JS como esta:
Você pode nomear seus valores de armazenamento local da maneira que desejar; meu chamado
hash
.Portanto, se o hash estiver definido na PAGE1 e você navegar para PAGE2; o hash será recriado na PAGE1 quando você clicar em Voltar na PAGE2.
fonte