¿Cómo modifico la URL sin volver a cargar la página?

¿Hay alguna forma de que pueda modificar la URL de la página actual sin volver a cargar la página?

Me gustaría acceder a la porción antes el hash # si es posible.

Solo necesito cambiar la porción después de el dominio, por lo que no es como si estuviera violando las políticas de dominios cruzados.

 window.location.href = "www.mysite.com/page2.php";  // Sadly this reloads

preguntado el 05 de mayo de 09 a las 07:05

Solo para facilitar la comprensión de la pregunta, esto es lo que hace Facebook cuando abres una foto, por ejemplo. La barra de URL cambia para apuntar DIRECTAMENTE a esa foto, por lo que puede compartir la URL sin perder el lugar en el que se encuentra en el sitio. ¿Recuerda los sitios basados ​​en marcos de la última década? Solo podía obtener la URL de la página de inicio, porque solo cambiaban los marcos internos. Y eso fue terrible. -

Aunque la history.pushState() es probablemente la respuesta correcta aquí, en esta situación (dependiendo de las circunstancias exactas ...) la posibilidad de usar una redirección del lado del servidor (como mediante el uso de la directiva RewriteRule de Apache) es algo que quizás desee considerar, o al menos ser conciente de. ¡Solo pensé que debería ser mencionado! -

19 Respuestas

¡Esto ahora se puede hacer en Chrome, Safari, Firefox 4+ e Internet Explorer 10pp4 +!

Consulte la respuesta de esta pregunta para obtener más información: Actualizando la barra de direcciones con una nueva URL sin hash o recargando la página

Ejemplo:

 function processAjaxData(response, urlPath){
     document.getElementById("content").innerHTML = response.html;
     document.title = response.pageTitle;
     window.history.pushState({"html":response.html,"pageTitle":response.pageTitle},"", urlPath);
 }

A continuación, puede utilizar window.onpopstate para detectar la navegación del botón de retroceso / avance:

window.onpopstate = function(e){
    if(e.state){
        document.getElementById("content").innerHTML = e.state.html;
        document.title = e.state.pageTitle;
    }
};

Para obtener una visión más detallada de la manipulación del historial del navegador, consulte este artículo de MDN.

respondido 17 mar '19, 09:03

HTML5 introdujo el history.pushState() e history.replaceState() métodos, que le permiten agregar y modificar entradas del historial, respectivamente.

window.history.pushState('page2', 'Title', '/page2.php');

Leer más sobre esto en aquí

Respondido el 08 de enero de 21 a las 18:01

También puedes usar HTML5 reemplazarEstado si desea cambiar la URL pero no desea agregar la entrada al historial del navegador:

if (window.history.replaceState) {
   //prevents browser from storing history with each change:
   window.history.replaceState(statedata, title, url);
}

Esto 'rompería' la funcionalidad del botón de retroceso. Esto puede ser necesario en algunos casos, como una galería de imágenes (donde desea que el botón Atrás regrese a la página de índice de la galería en lugar de retroceder a través de todas y cada una de las imágenes que vio) mientras le da a cada imagen su propia URL única.

Respondido el 04 de junio de 14 a las 08:06

Aquí está mi solución (newUrl es su nueva URL que desea reemplazar con la actual):

history.pushState({}, null, newUrl);

respondido 17 mar '19, 09:03

Es mejor probar primero con if (history.pushState) {} Por si acaso el navegador antiguo. - craig jacobs

Esto ya no funciona, obtendrá en Firefox: La operación es insegura. - katusic

Y el usuario puede incluso establecer un marcador con ese enfoque, ¡hermoso! Ahora puedo actualizar la URL en la entrada del usuario y él puede marcar directamente sus configuraciones. - códigopleb

Hey kkatusic, por eso Craig Jacobs dijo TEST. Lo prueba intentando ejecutar la nueva versión html5 (prueba 1) y si eso falla, prueba la versión anterior y si falla, tiene problemas, si la prueba tiene éxito para cualquiera de los objetos, entonces sabrá si el navegador es nuevo o antiguo. compañero de lógica bastante simple! ¡Vota a favor de Craig! :) - Gregorio Bowers

NOTA: Si está trabajando con un navegador HTML5, debe ignorar esta respuesta. Esto ahora es posible, como se puede ver en las otras respuestas.

No hay forma de modificar el Enlance en el navegador sin recargar la página. La URL representa cuál fue la última página cargada. Si lo cambia (document.location) luego volverá a cargar la página.

Una razón obvia es que escribes un sitio en www.mysite.com que parece una página de inicio de sesión bancaria. Luego cambia la barra de URL del navegador para decir www.mybank.com. El usuario ignorará por completo que realmente está mirando www.mysite.com.

respondido 04 nov., 19:11

parent.location.hash = "hello";

respondido 23 mar '13, 17:03

Quiero cambiar la URL, no solo el hash - #mydata - petirrojo rodricks

Cambiar el hash puede ser útil en ajax, ya que es un tipo de estado sin el uso de cookies, se puede marcar como favorito y es compatible con los botones de retroceso del navegador. Gmail usa esto hoy en día para hacerlo más amigable con el navegador. - Bloqueo de mateo

@Jarvis: ¿cuál es la diferencia? - ruidoso

@noisy El seguimiento del lado del servidor no puede ver hash a menos que se envíe al servicio de seguimiento explícitamente. - MLK.DEV

esto no es útil si está utilizando un marco mvc que se enruta en hash, por ejemplo, backbone. - tejón gato

En moderno navegadores y HTML5, hay un método llamado pushState en la ventana history. Eso cambiará la URL y la enviará al historial sin cargar la página.

Puede usarlo así, tomará 3 parámetros, 1) objeto de estado 2) título y una URL):

window.history.pushState({page: "another"}, "another page", "example.html");

Esto cambiará la URL, pero no volverá a cargar la página. Además, no verifica si la página existe, por lo que si usa algún código JavaScript que reaccione a la URL, puede trabajar con ellos de esta manera.

También hay history.replaceState() que hace exactamente lo mismo, excepto que modificará el historial actual en lugar de crear uno nuevo.

También puede crear una función para comprobar si history.pushState existen, luego continúe con el resto así:

function goTo(page, title, url) {
  if ("undefined" !== typeof history.pushState) {
    history.pushState({page: page}, title, url);
  } else {
    window.location.assign(url);
  }
}

goTo("another page", "example", 'example.html');

También puede cambiar el # para <HTML5 browsers, que no recargará la página. Esa es la forma en que Angular usa para hacer SPA según hashtag ...

Cambiar # es bastante fácil, hacer como:

window.location.hash = "example";

Y puedes detectarlo así:

window.onhashchange = function () {
  console.log("#changed", window.location.hash);
}

respondido 17 mar '19, 09:03

haría window.onhashchange e window.onpopstate hacer lo mismo en este caso? - J0ANMM

¿Cómo cargar el contenido de la página también? Simplemente reemplaza la URL - MARYLAND. Atiqur Rahman

Cargue contenido como lo haría normalmente con ajax. - desarrollador de Android

El HTML5 replaceState es la respuesta, como ya lo mencionaron Vivart y geo1701. Sin embargo, no es compatible con todos los navegadores / versiones. Historia.js envuelve las características del estado de HTML5 y proporciona soporte adicional para los navegadores HTML4.

respondido 21 nov., 12:11

Antes de HTML5 podemos usar:

parent.location.hash = "hello";

y:

window.location.replace("http:www.example.com");

Este método recargará su página, pero HTML5 introdujo el history.pushState(page, caption, replace_url) que no debería recargar tu página.

Respondido 26 Feb 15, 22:02

El problema con history.pushState(..) es decir, que si desea redirigir a otro dominio, la política de dominio cruzado entra en vigencia. Mientras que con window.location.replace(..)es posible redireccionar a otro dominio. - OSWorX

Si lo que está tratando de hacer es permitir que los usuarios marquen / compartan páginas, y no necesita que sea exactamente la URL correcta, y no está usando anclajes hash para nada más, puede hacerlo en dos partes; utiliza location.hash mencionado anteriormente, y luego implementa una verificación en la página de inicio, para buscar una URL con un ancla de hash en ella, y lo redirecciona al resultado posterior.

Por ejemplo:

1) El usuario está activado www.site.com/section/page/4

2) El usuario realiza alguna acción que cambia la URL a www.site.com/#/section/page/6 (con el hash). Supongamos que ha cargado el contenido correcto para la página 6 en la página, por lo que, aparte del hash, el usuario no se molesta demasiado.

3) El usuario pasa esta URL a otra persona o la agrega a marcadores.

4) Alguien más, o el mismo usuario en una fecha posterior, va a www.site.com/#/section/page/6

5) Código en www.site.com/ redirige al usuario a www.site.com/section/page/6, usando algo como esto:

if (window.location.hash.length > 0){ 
   window.location = window.location.hash.substring(1);
}

¡Espero que tenga sentido! Es un enfoque útil para algunas situaciones.

Respondido el 10 de enero de 18 a las 12:01

A continuación se muestra la función para cambiar la URL sin volver a cargar la página. Solo es compatible con HTML5.

  function ChangeUrl(page, url) {
        if (typeof (history.pushState) != "undefined") {
            var obj = {Page: page, Url: url};
            history.pushState(obj, obj.Page, obj.Url);
        } else {
            window.location.href = "homePage";
            // alert("Browser does not support HTML5.");
        }
    }

  ChangeUrl('Page1', 'homePage');

respondido 09 mar '19, 18:03

@Green, la página es un título corto para el estado al que se está mudando. Firefox actualmente ignora este parámetro, aunque puede usarlo en el futuro. Pasar la cadena vacía aquí debería ser seguro contra futuros cambios en el método. De: desarrollador.mozilla.org/en-US/docs/Web/API/… - Robalo

Cualquier cambio de la ubicación (ya sea window.location or document.location) provocará una solicitud en esa nueva URL, si no solo está cambiando el fragmento de URL. Si cambia la URL, cambia la URL.

Utilice técnicas de reescritura de URL del lado del servidor como Mod_rewrite de Apache si no le gustan las URL que está utilizando actualmente.

contestado el 05 de mayo de 09 a las 11:05

¿Puedo usar "location.pathname"? - petirrojo rodricks

No, cambiar ese atributo también provocará una solicitud. - Gumbo

Puede agregar etiquetas de anclaje. Utilizo esto en mi sitio para poder rastrear con Google Analytics lo que las personas visitan en la página.

Solo agrego una etiqueta de anclaje y luego la parte de la página que quiero rastrear:

var trackCode = "/#" + urlencode($("myDiv").text());
window.location.href = "http://www.piano-chords.net" + trackCode;
pageTracker._trackPageview(trackCode);

Respondido el 19 de enero de 20 a las 21:01

Puede utilizar esta hermosa y sencilla función en cualquier lugar de su aplicación.

function changeurl(url, title) {
    var new_url = '/' + url;
    window.history.pushState('data', title, new_url);
    
}

No solo puede editar la URL, sino que también puede actualizar el título.

Muy útil a todos.

Respondido 09 Feb 21, 07:02

Funciona a las mil maravillas incluso para las anclas. window.history.pushState('data', 'Title', '#new_location'); - BIOHAZARD

¿Por qué no usas el argumento 'título' como título en pushState? - xerus

Como señaló Thomas Stjernegaard Jeppesen, podría utilizar Historia.js para modificar los parámetros de URL mientras el usuario navega a través de sus enlaces y aplicaciones Ajax.

Ha pasado casi un año desde esa respuesta, y History.js creció y se volvió más estable y entre navegadores. Ahora se puede utilizar para administrar los estados del historial en navegadores compatibles con HTML5 y en muchos navegadores que solo admiten HTML4. En esta demostración Puedes ver un ejemplo de cómo funciona (además de poder probar sus funcionalidades y límites.

Si necesita ayuda sobre cómo usar e implementar esta biblioteca, le sugiero que eche un vistazo al código fuente de la página de demostración: verá que es muy fácil de hacer.

Finalmente, para obtener una explicación completa de cuáles pueden ser los problemas relacionados con el uso de hash (y hashbangs), consulte este enlace por Benjamin Lupton.

Respondido el 05 de Septiembre de 13 a las 14:09

Utilice la herramienta history.pushState() desde la API de historial de HTML 5.

Para obtener más detalles sobre cómo diseñar y realizar los esfuerzos de seguimiento y evaluación, referirse al API de historial de HTML5 para más información.

respondido 17 mar '19, 09:03

Tu nueva URL.

let newUrlIS =  window.location.origin + '/user/profile/management';

En cierto sentido, llamar a pushState () es similar a configurar window.location = "#foo", ya que ambos también crearán y activarán otra entrada de historial asociada con el documento actual. Pero pushState () tiene algunas ventajas:

history.pushState({}, null, newUrlIS);

Respondido 18 Jul 20, 07:07

por favor agregue una referencia a las supuestas "ventajas" de pushState :) - xerus

Este código me funciona. Lo usé en mi aplicación en ajax.

history.pushState({ foo: 'bar' }, '', '/bank');

Una vez que una página se carga en una ID usando ajax, cambia la URL del navegador automáticamente sin volver a cargar la página.

Esta es la función ajax a continuación.

function showData(){
    $.ajax({
      type: "POST",
      url: "Bank.php", 
      data: {}, 
      success: function(html){          
        $("#viewpage").html(html).show();
        $("#viewpage").css("margin-left","0px");
      }
    });
  }

Ejemplo: Desde cualquier página o controlador como "Panel de control", cuando hago clic en el banco, carga la lista de bancos usando el código ajax sin recargar la página. En este momento, no se cambiará la URL del navegador.

history.pushState({ foo: 'bar' }, '', '/bank');

Pero cuando uso este código en ajax, cambia la URL del navegador sin volver a cargar la página. Este es el código ajax completo aquí a continuación.

function showData(){
        $.ajax({
          type: "POST",
          url: "Bank.php", 
          data: {}, 
          success: function(html){          
            $("#viewpage").html(html).show();
            $("#viewpage").css("margin-left","0px");
            history.pushState({ foo: 'bar' }, '', '/bank');
          }
        });
      }

Respondido el 10 de enero de 21 a las 15:01

Esto es todo lo que necesitará para navegar sin recargar.

// add setting without reload 
location.hash = "setting";

// if url change with hash do somthing
window.addEventListener('hashchange', () => {
    console.log('url hash changed!');
});

// if url change do somthing (dont detect changes with hash)
//window.addEventListener('locationchange', function(){
//    console.log('url changed!');
//})


// remove #setting without reload 

history.back();

Respondido 09 Oct 20, 19:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.