Me temo que puede ser imposible, pero ¿hay alguna manera de cambiar el valor hash de una URL sin dejar una entrada en el historial del navegador y sin recargar ? ¿O el equivalente?
En cuanto a los detalles, estaba desarrollando una navegación hash básica en las líneas de:
//hash nav -- works with js-tabs
var getHash = window.location.hash;
var hashPref = "tab-";
function useHash(newHash) {
//set js-tab according to hash
newHash = newHash.replace('#'+hashPref, '');
$("#tabs li a[href='"+ newHash +"']").click();
}
function setHash(newHash) {
//set hash according to js-tab
window.location.hash = hashPref + newHash;
//THIS IS WHERE I would like to REPLACE the location.hash
//without a history entry
}
// ... a lot of irrelavent tabs js and then....
//make tabs work
$("#tabs.js-tabs a").live("click", function() {
var showMe = $(this).attr("href");
$(showMe).show();
setHash(showMe);
return false;
});
//hash nav on ready .. if hash exists, execute
if ( getHash ){
useHash(getHash);
}
Usando jQuery, obviamente. La idea es que en esta instancia específica 1) hacer que el usuario vuelva a cada cambio de pestaña podría efectivamente 'romper el botón de retroceso' al acumular referencias innecesarias, y 2) no retener en qué pestaña se encuentra actualmente si presiona actualizar es una molestia.
Respuestas:
location.replace("#hash_value_here");
funcionó bien para mí hasta que descubrí que no funciona en IOS Chrome. En cuyo caso, utilice:Recuerde mantener la
#
o la última parte de la URL será alterada.fuente
window.location.hash = 'my-hash';
seguido dehistory.replaceState(undefined, undefined, "#my-hash")
?history.replaceState
diferencia delocation.replace
?Lo anterior parece hacer lo que buscas.
fuente
window.location.replace(('' + window.location).split('#')[0] + '#' + hash);
para actualizar el hash<base href ="http://example.com/" />
si contiene una etiqueta base , entonces, cuando use el método de reemplazo con solo un principio"#hash_value_here"
, será como si dijera `location.replace (' example.com/#hash_value_here' ). Esto parece obvio cuando lo lee aquí, pero es un problema cuando está en una página con un fragmento de ruta y no se da cuenta de que la base está configurada.Editar: Han pasado un par de años y los navegadores han evolucionado.
La respuesta de @ Luxiyalu es el camino a seguir
- Respuesta anterior -
Yo también creo que es imposible (en este momento). Pero, ¿por qué necesita cambiar el valor hash si no lo va a utilizar?
Creo que la razón principal por la que usamos el valor hash como programadores es para permitir que el usuario marque nuestras páginas o para guardar un estado en el historial del navegador. Si no desea hacer nada de esto, simplemente guarde el estado en una variable y trabaje desde allí.
Creo que la razón para usar un hash es trabajar con un valor que está fuera de nuestro control. Si no lo necesita, probablemente significa que tiene todo bajo su control, así que simplemente almacene el estado en una variable y trabaje con él. (Me gusta repetirme)
Espero que esto te ayude. Quizás haya una solución más fácil para su problema.
ACTUALIZACIÓN: ¿Qué tal esto?
window.history.back(1)
, eso hará que el historial retroceda desde tu primer hash de inicio.Probablemente tendrá que usar algunas banderas para saber si la entrada actual se puede "eliminar" volviendo atrás, o si simplemente se salta el primer paso. Y para asegurarse de que su método de carga para el "hash" no se ejecute, cuando fuerce el
history.back
.fuente
?mystate=greatness
), aunque no necesita ser ajax, puede guardar información para que el javascript la lea al inicializar la solicitud.Siempre puede crear un detector de eventos para detectar eventos de clic en el hipervínculo y en la función de devolución de llamada poner e.preventDefault (), que debería evitar que el navegador lo inserte en el historial.
fuente