¿Cómo eliminar el hash de window.location (URL) con JavaScript sin actualizar la página?

332

Tengo URL como: http://example.com#something¿cómo elimino #somethingsin hacer que la página se actualice?

Intenté la siguiente solución:

window.location.hash = '';

Sin embargo, esto no elimina el símbolo hash #de la URL.

Tom Lehman
fuente
3
¿Realmente quieres hacer esto? Causará una actualización de la página.
seth
99
¿Es posible prescindir de una actualización de página?
Tom Lehman
1
Que es posible. Las bibliotecas de historia de AJAX se ocupan de ello. Pero no es fácil, y debe hacerse de manera diferente para casi todos los navegadores. No es algo en lo que quieras meterte.
Gabriel Hurley
¿Hay alguna idea de dejar atrás un "#" que no sea visual?
user29660

Respuestas:

211

Pregunta inicial:

window.location.href.substr(0, window.location.href.indexOf('#'))

o

window.location.href.split('#')[0]

ambos devolverán la URL sin el hash ni nada después.

Con respecto a su edición:

Cualquier cambio a window.locationactivará una actualización de la página. Puede cambiar window.location.hashsin activar la actualización (aunque la ventana saltará si su hash coincide con una identificación en la página), pero no puede deshacerse del signo hash. Elija lo que es peor ...

RESPUESTA MÁS ACTUALIZADA

La respuesta correcta sobre cómo hacerlo sin sacrificar (ya sea recarga completa o dejar el signo hash allí) está aquí abajo . Dejando esta respuesta aquí, sin embargo, con respecto a ser la original en 2009, mientras que la correcta que aprovecha las nuevas API del navegador se dio 1.5 años después.

Gabriel Hurley
fuente
22
Esto es simplemente incorrecto, puede cambiar window.location.hash y no activará una actualización.
Evgeny
61
@Evgeny: eso es lo que dice mi respuesta. Digo explícitamente que cambiar window.location.hash no activará una actualización. "Puede cambiar window.location.hash sin activar la actualización (aunque la ventana saltará si su hash coincide con una identificación en la página)".
Gabriel Hurley el
3
Sin recarga de página, eso está en la pregunta. ¡Esta no es la respuesta, ya que requiere / obliga a recargar la página!
Ed_
10
También creo que no debería ser la ✓ respuesta
abernier
44
Esta no es una respuesta a la pregunta de OP.
Bryce
586

Resolver este problema está mucho más al alcance hoy en día. La API de historial HTML5 nos permite manipular la barra de ubicación para mostrar cualquier URL dentro del dominio actual.

function removeHash () { 
    history.pushState("", document.title, window.location.pathname
                                                       + window.location.search);
}

Demostración de trabajo: http://jsfiddle.net/AndyE/ycmPt/show/

Esto funciona en Chrome 9, Firefox 4, Safari 5, Opera 11.50 y en IE 10. Para los navegadores no compatibles, siempre puedes escribir un script que se use con gracia cuando esté disponible:

function removeHash () { 
    var scrollV, scrollH, loc = window.location;
    if ("pushState" in history)
        history.pushState("", document.title, loc.pathname + loc.search);
    else {
        // Prevent scrolling by storing the page's current scroll offset
        scrollV = document.body.scrollTop;
        scrollH = document.body.scrollLeft;

        loc.hash = "";

        // Restore the scroll offset, should be flicker free
        document.body.scrollTop = scrollV;
        document.body.scrollLeft = scrollH;
    }
}

Para que pueda deshacerse del símbolo hash, simplemente no en todos los navegadores, todavía.

Nota: si desea reemplazar la página actual en el historial del navegador, use en replaceState()lugar de pushState().

Andy E
fuente
99
Use esta línea para asegurarse de no perder la cadena de consulta: history.pushState ("", document.title, window.location.pathname + window.location.search);
Phil Kulak
66
@ Phil: gracias por señalarlo, he actualizado la respuesta en consecuencia. Estoy demasiado acostumbrado a usar URL bonitas.
Andy E
1
Para versiones anteriores de IE, parece que necesita usar document.documentElement en lugar de document.body. Ver esta respuesta stackoverflow.com/a/2717272/359048
jasonmcclurg
29
Sugiero usar replaceState en lugar de pushState, para no crear una entrada adicional en el historial del navegador.
Nico
1
@santiagoarizti: tienes razón, acabo de llegar a la misma conclusión. No inspeccioné el código que escribí (¡hace 7 años!) Correctamente y extrañé que también estaba cambiando el estado del botón al eliminar el hash. Dado que está cambiando el hash manualmente, siempre podría desencadenar el evento usted mismo, supongo.
Andy E
86

(Demasiadas respuestas son redundantes y desactualizadas). La mejor solución ahora es esta:

history.replaceState(null, null, ' ');
Pacerier
fuente
55
use history.pushState(null, null, ' ')en su lugar si desea preservar el historial.
nichijou
99
Podría ser útil para explicar lo que pasa nullpor las statey titlelos parámetros en última instancia hace.
V. Rubinetti
Un problema con esto, y el resto, es que no desencadena el cambio, a pesar de que el hash ahora está vacío cuando no lo estaba antes.
Curtis
1
En TypeScript, no se permite nulo para el segundo parámetro porque el comando toma una cadena. Mozilla recomienda una cadena vacía.
Curtis
41

Simple y elegante:

history.replaceState({}, document.title, ".");  // replace / with . to keep url
cprcrack
fuente
3
use un punto en lugar de una barra inclinada si desea permanecer en el mismo directorio
vahanpwns
1
Actualice la respuesta con respecto a la nota @vahanpwns, para usar en .lugar de /. El uso /cambia la url a la ruta raíz.
Isaac Gregson
55
Gracias por esta respuesta, modifiqué history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));para mi caso de uso.
Scott Jungwirth
55
Esto no conserva la consulta de URL.
Vladislav Kostenko
2
Mi caso de uso también fue reemplazar en lugar de presionar, pero esto tiene más sentido para mí:history.replaceState(null, document.title, location.pathname + location.search);
MDMower
16

Para eliminar el hash, puede intentar usar esta función

function remove_hash_from_url()
{
    var uri = window.location.toString();
    if (uri.indexOf("#") > 0) {
        var clean_uri = uri.substring(0, uri.indexOf("#"));
        window.history.replaceState({}, document.title, clean_uri);
    }
}
Rahul Gupta
fuente
13

Esto eliminará también el hash final. Por ejemplo: http://test.com/123#abc -> http://test.com/123

if(window.history.pushState) {
    window.history.pushState('', '/', window.location.pathname)
} else {
    window.location.hash = '';
}
Chris Gunawardena
fuente
Esto elimina cualquier parámetro de consulta presente en la URL :(
kevgathuku
1
@kevgathuku puede agregarlos nuevamente con location.search, por ejemplo: `window.history.pushState ('', '/', window.location.pathname + window.location.search)`
Chris Gunawardena
6

¿Qué tal lo siguiente?

window.location.hash=' '

Tenga en cuenta que estoy configurando el hash en un solo espacio y no en una cadena vacía.


Establecer el hash en un ancla no válida tampoco causa una actualización. Como,

window.location.hash='invalidtag'

Pero, encuentro que la solución anterior es engañosa. Esto parece indicar que hay un ancla en la posición dada con el nombre dado, aunque no hay ninguno. Al mismo tiempo, el uso de una cadena vacía hace que la página se mueva a la parte superior, lo que a veces puede ser inaceptable. El uso de un espacio también garantiza que siempre que la URL se copie, marque y vuelva a visitar, la página generalmente estará en la parte superior y se ignorará el espacio.

Y, oye, esta es mi primera respuesta en StackOverflow. Espero que alguien lo encuentre útil y coincida con los estándares de la comunidad.

Nibras Reeza
fuente
77
Establecer hash en espacios en blanco todavía mantiene el # al final de la URL, creo que el objetivo es eliminarlo por completo.
mahemoff
1
Sigue un hash al final de la URL. La pregunta es cómo eliminar eso.
Gurmeet Singh
Sí, ¿cómo podemos eliminar # también con una cadena hash?
Bhavin Thummar
6

Puedes hacerlo de la siguiente manera:

history.replaceState({}, document.title, window.location.href.split('#')[0]);

METALHEAD
fuente
1
La respuesta destacada no funcionó para mí en ninguno de los casos, pero esta sí. ¡Gracias!
Dev
5
const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);
Casey
fuente
2
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
rollstuhlfahrer
3
<script type="text/javascript">
var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
    var clean_uri = uri.substring(0, uri.indexOf("?"));
    window.history.replaceState({}, document.title, clean_uri);
}
</script>

poner este código en la sección de la cabeza

Manigandan Raamanathan
fuente
3
function removeLocationHash(){
    var noHashURL = window.location.href.replace(/#.*$/, '');
    window.history.replaceState('', document.title, noHashURL) 
}

window.addEventListener("load", function(){
    removeLocationHash();
});
Vimal Kumar
fuente
2

Creo que sería más seguro

if (window.history) {
    window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
    window.location.hash = '';
}
Konstantin Lekh
fuente
0

Intenta lo siguiente:

window.history.back(1);
Vishal Sharma
fuente
23
Esto no responde a la pregunta si el usuario ha llegado directamente a la URL, incluido el hash.
nickb
Este truco es muy útil cuando solo quieres crear un enlace a la página anterior, pero el enlace está oculto en un montón de archivos js.
ValidfroM
Exactamente lo que estaba buscando. Esto funciona perfectamente para eliminar un hashtag recién creado por mi aplicación web para consumir un valor devuelto por una función javasript.
user278859
0

Aquí hay otra solución para cambiar la ubicación usando href y borrar el hash sin desplazarse.

La solución mágica se explica aquí . Especificaciones aquí .

const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;    
history.pushState('', document.title, window.location.pathname);

NOTA: La API propuesta ahora es parte de WhatWG HTML Living Standard

voscausa
fuente
0
  $(window).on('hashchange', function (e) {
        history.replaceState("", document.title, e.originalEvent.oldURL);
    });
JohnMathew
fuente
-1

Puede reemplazar hash con nulo

var urlWithoutHash = document.location.href.replace(location.hash , "" );
Devang Bhagdev
fuente
1
La pregunta es "sin hacer que la página se actualice", pero este método actualiza la página. Debe tener en cuenta este hecho en su respuesta, por lo que no todos tenemos que perder el tiempo descubriendo de primera mano que está respondiendo una pregunta diferente a la que realmente estamos tratando de responder aquí.
Vladimir Kornea
No actualiza la página.
Ciprian