jquery: altera o endereço da URL sem redirect?

Duplicar Possível:
Modificar URL da barra de endereços no aplicativo AJAX para corresponder ao estado atual

Como posso alterar o endereço da URL sem redirect a página?

Por exemplo, quando clico neste link abaixo:

link 

Vou pegar o URL do link:

 var path = object.attr('href'); 

Se eu fizer isso abaixo, a página será redirecionada:

 window.location = path; 

Eu quero fazer algo parecido com este site , quando você clica na imagem, a chamada ajax buscará a página solicitada e o endereço de URL na janela também será alterado, para que tenha um caminho para o que você clicar.

NOTA: history.pushState() agora é suportado – veja outras respostas.

Você não pode mudar a URL inteira sem redirect, o que você pode fazer é mudar o hash .

O hash é a parte da URL que vai depois do símbolo #. Isso foi inicialmente destinado a direcioná-lo (localmente) para seções do seu documento HTML, mas você pode lê-lo e modificá-lo através do javascript para usá-lo de alguma forma como uma variável global .


Se aplicada bem, esta técnica é útil de duas maneiras:

  1. o histórico do navegador lembrará cada passo diferente que você deu (desde que o URL + hash tenha mudado)
  2. Você pode ter um endereço que vincula não apenas a um determinado documento HTML, mas também dá ao seu javascript uma pista sobre o que fazer. Isso significa que você acaba apontando para um estado dentro do seu aplicativo da web.

Para alterar o hash que você pode fazer:

 document.location.hash = "show_picture"; 

Para observar mudanças de hash você precisa fazer algo como:

 window.onhashchange = function(){ var what_to_do = document.location.hash; if (what_to_do=="#show_picture") show_picture(); } 

Claro que o hash é apenas uma string, então você pode fazer praticamente o que quiser com ele. Por exemplo, você pode colocar um object inteiro lá, se você usar o JSON para restringi- lo.

Há muito boas bibliotecas JQuery para fazer coisas avançadas com isso.

Veja aqui – http://my.opera.com/community/forums/topic.dml?id=1319992&t=1331393279&page=1#comment11751402

Essencialmente:

 history.pushState('data', '', 'http://your-domain/path'); 

Você pode manipular o object de histórico para fazer isso funcionar.

Ele só funciona no mesmo domínio, mas como você está satisfeito com o uso da abordagem de hash tag, isso não importa.

Obviamente, precisaria ser testado em vários navegadores, mas como isso foi postado no fórum do Opera, posso afirmar que funcionaria no Opera e testei-o no Chrome e funcionou bem.

Esse site faz uso da parte “fragment” de um URL: o material depois do “#”. Isso não é enviado ao servidor pelo navegador como parte da solicitação GET, mas pode ser usado para armazenar o estado da página. Então, sim, você pode alterar o fragment sem causar uma atualização ou recarregamento de página. Quando a página é carregada, seu javascript lê esse fragment e atualiza o conteúdo da página apropriadamente, buscando dados do servidor por meio de solicitações ajax, conforme necessário. Para ler o fragment em js:

 var fragment = location.hash; 

mas observe que esse valor includeá o caractere “#” no começo. Para definir o fragment:

 location.hash = "your_state_data"; 

Você não pode fazer o que pede (e o site vinculado também não faz exatamente isso).

Você pode , no entanto, modificar a parte da URL após o sinal # , que é chamado de fragment , assim:

 window.location.hash = 'something'; 

Fragmentos não são enviados para o servidor (por exemplo, o próprio Google não pode dizer a diferença entre http://www.google.com/ e http://www.google.com/#something ), mas eles podem ser lido por Javascript na sua página. Por sua vez, esse JavaScript pode decidir executar uma solicitação AJAX diferente com base no valor do fragment, que é como o site ao qual você ligou provavelmente o faz.

Isso é obtido por meio de regravação de URL, não por ofuscação de URL, o que não pode ser feito.

Outra maneira de fazer isso, como foi mencionado, é mudar a hashtag, com

 window.location.hash = "/2131/" 

Não, porque isso abriria as comportas do phishing. A única parte do URI que você pode mudar é o fragment (tudo depois do # ). Você pode fazê-lo, definindo window.location.hash .

Você não pode realmente mudar o URL inteiro na barra de localização sem redirect (pense nos problemas de segurança!).

No entanto, você pode alterar a parte hash (o que é depois do # ) e ler isso: location.hash

ps. impedir o redirecionamento onclick padrão de um link por algo como:

 $("#link").bind("click",function(e){ doRedirectFunction(); e.preventDefault(); })