jquery: cambiar la dirección URL sin redirigir?

Posible duplicado:
Modifique la URL de la barra de direcciones en la aplicación AJAX para que coincida con el estado actual

¿Cómo puedo cambiar la dirección URL sin redirigir la página?

Por ejemplo, cuando hago clic en este enlace a continuación:

link 

Tomaré la URL del enlace:

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

Si hago esto a continuación, la página será redirigida:

 window.location = path; 

Quiero hacer algo como este sitio , cuando haces clic en la imagen, la llamada ajax buscará la página solicitada y también se cambiará la dirección URL en la ventana, para que tenga una ruta para lo que haces clic.

NOTA: history.pushState() ahora es compatible; vea otras respuestas.

No puede cambiar la URL completa sin redirigir, lo que puede hacer es cambiar el hash .

El hash es la parte de la url que sigue al símbolo #. Inicialmente, esto tenía la intención de dirigirlo (localmente) a secciones de su documento HTML, pero puede leerlo y modificarlo a través de javascript para usarlo como una variable global .


Si se aplica bien, esta técnica es útil de dos maneras:

  1. el historial del navegador recordará cada paso diferente que tomó (desde que se modificó url + hash)
  2. puede tener una dirección que enlace no solo a un documento html en particular, sino que también proporcione a su javascript una pista sobre qué hacer. Eso significa que terminas apuntando a un estado dentro de tu aplicación web.

Para cambiar el hash puedes hacer:

 document.location.hash = "show_picture"; 

Para ver los cambios hash tienes que hacer algo como:

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

Por supuesto, el hash es solo una cadena, por lo que puedes hacer prácticamente lo que quieras con él. Por ejemplo, puedes poner un objeto completo allí si usas JSON para codificarlo .

Hay muy buenas bibliotecas JQuery para hacer cosas avanzadas con eso.

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

Esencialmente:

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

Puede manipular el objeto de historial para que esto funcione.

Solo funciona en el mismo dominio, pero como está satisfecho con el uso del método de etiqueta hash, eso no debería importar.

Obviamente necesitaría ser probado en varios navegadores, pero como eso fue publicado en el foro de Opera, estoy seguro de suponer que funcionaría en Opera, y lo probé en Chrome y funcionó bien.

Ese sitio hace uso de la parte “fragmento” de una url: las cosas después del “#”. El navegador no lo envía al servidor como parte de la solicitud GET, pero se puede usar para almacenar el estado de la página. Entonces, sí, puedes cambiar el fragmento sin provocar que una página se actualice o se vuelva a cargar. Cuando se carga la página, su javascript lee este fragmento y actualiza el contenido de la página de forma adecuada, obteniendo datos del servidor a través de solicitudes ajax, según sea necesario. Para leer el fragmento en js:

 var fragment = location.hash; 

pero tenga en cuenta que este valor incluirá el carácter “#” al principio. Para establecer el fragmento:

 location.hash = "your_state_data"; 

No puede hacer lo que pide (y el sitio vinculado tampoco hace exactamente eso).

Sin embargo, puede modificar la parte de la url después del signo # , que se llama fragmento , así:

 window.location.hash = 'something'; 

Los fragmentos no se envían al servidor (por lo que, por ejemplo, Google no puede distinguir entre http://www.google.com/ y http://www.google.com/#something ), pero pueden ser lee por Javascript en tu página. A su vez, este Javascript puede decidir realizar una solicitud AJAX diferente en función del valor del fragmento, que es como probablemente lo hace el sitio al que se ha vinculado.

Esto se logra a través de la reescritura de URL, no a través de la ofuscación de URL, que no se puede hacer.

Otra forma de hacerlo, como se ha mencionado es cambiando el hashtag, con

 window.location.hash = "/2131/" 

No, porque eso abriría las compuertas para el phishing. La única parte del URI que puede cambiar es el fragmento (todo después del # ). Puede hacerlo configurando window.location.hash .

Realmente no se puede cambiar toda la URL en la barra de direcciones sin redirigir (¡piense en los problemas de seguridad!).

Sin embargo, puede cambiar la parte hash (lo que viene después del # ) y leer eso: location.hash

PD. evite el redireccionamiento onclick predeterminado de un enlace de la siguiente manera:

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