Diferencia entre window.location.href, window.location.replace y window.location.assign

129

Cuál es la diferencia entre

  1. window.location.href="http://example.com";
  2. window.location.replace("http://example.com");
  3. window.location.assign("http://example.com");

Leí en muchos foros que window.location.assign()simplemente reemplaza el historial de sesión actual y, por lo tanto, el botón de retroceso del navegador no funcionará. Sin embargo, no puedo reproducir esto.

function fnSetVariable() {
    //window.location.href = "http://example.com";
    window.location.replace("http://example.com");
    //window.location.assign("http://example.com");
}

<a onmouseover="fnSetVariable();" 
   href="PageCachingByParam.aspx?id=12" >
   CLICK 
</a>
milan_9211
fuente
1
Puede ver una publicación anterior en la URL: stackoverflow.com/questions/1865837/ ... espero que sea útil
Aquí hay una mejor explicación: stackoverflow.com/a/847130/96656
Mathias Bynens

Respuestas:

165

Estos hacen lo mismo:

window.location.assign(url);
window.location = url;
window.location.href = url;

Simplemente navegan a la nueva URL. Por replaceotro lado, el método navega a la URL sin agregar un nuevo registro al historial.

Entonces, lo que ha leído en esas muchas formas no es correcto. El assignmétodo agrega un nuevo registro al historial.

Referencia: http://developer.mozilla.org/en/window.location

Guffa
fuente
1
Muchas gracias por la respuesta. Me ayudó mucho a resolver el problema del botón de retroceso del navegador.
santosh kumar patro
@blunderboy: De todos modos, es la mejor respuesta por un deslizamiento de tierra, así que eso no cambiaría nada.
BoltClock
Entonces, ¿de qué sirve assign()? De esta respuesta y los documentos, suena idéntico a location = ....
Mitya
11

La parte de no poder usar el botón Atrás es una mala interpretación común. window.location.replace (URL) elimina la UNA entrada superior de la lista del historial de la página, sobrescribiéndola con la nueva entrada, de modo que el usuario no pueda volver fácilmente a esa ÚNICA página web en particular. La función NO borra toda la lista del historial de la página, ni hace que el botón Atrás no sea completamente funcional.

(Función NO, ni combinación de parámetros que yo sepa cambio puede o sobrescribir entradas de la lista historia que usted no es dueño de absolutamente ciertos navegadores - generalmente impelement esta limitación de seguridad simplemente ni siquiera definir cualquier operación que podría parecer a todos afectan cualquier entrada que no sea el primero en la lista del historial de la página. Me estremezco al pensar qué tipo de cosas cobardes podría hacer el malware si existiera tal función).

Si realmente desea que el botón Atrás no sea funcional (probablemente no sea "fácil de usar": piense de nuevo si eso es realmente lo que desea hacer), "abra" una ventana nueva. (También puede "abrir" una ventana emergente que ni siquiera tiene un botón "Atrás" ... pero las ventanas emergentes no son muy populares en estos días :-) Si desea que su página se muestre sin importar lo que haga el usuario ( una vez más, la "facilidad de uso" es cuestionable), configure un controlador window.onunload que simplemente recargue su página de nuevo clara desde el principio cada vez.

Chuck Kollars
fuente
4
'NINGUNA función ni combinación de parámetros que conozca puede cambiar o sobrescribir las entradas de la lista del historial' ... Bienvenido a HTML5
SpYk3HH
6
La imposibilidad de cambiar o sobrescribir las entradas del historial del navegador que no posee es una regla de seguridad que existe desde hace mucho tiempo. HTML5 simplemente continúa esa regla.
Chuck Kollars
Te perdiste el punto o más bien el sarcasmo. Busque html5 e historial
SpYk3HH