Ich fürchte, es könnte unmöglich sein, aber gibt es eine Möglichkeit, den Hashwert einer URL zu ändern, ohne einen Eintrag im Browserverlauf zu hinterlassen und ohne ihn neu zu laden ? Oder das Gleiche tun?
Was die Einzelheiten angeht, habe ich einige grundlegende Hash-Navigationen entwickelt, die wie folgt aussehen:
//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);
}
Natürlich mit jQuery. Die Idee ist, dass in diesem speziellen Fall 1) das Zurückgehen des Benutzers bei jeder Tab-Änderung die Schaltfläche "Zurück" durch Aufstapeln unnötiger Referenzen effektiv "brechen" kann und 2) nicht beibehalten wird, auf welcher Registerkarte sie sich gerade befinden, wenn sie auf "Aktualisieren" klicken ein Ärger.
Antworten:
location.replace("#hash_value_here");
funktionierte gut für mich, bis ich feststellte, dass es unter IOS Chrome nicht funktioniert. In diesem Fall verwenden Sie:Denken Sie daran, den
#
oder den letzten Teil der URL beizubehalten.quelle
window.location.hash = 'my-hash';
gefolgt von verwendenhistory.replaceState(undefined, undefined, "#my-hash")
?history.replaceState
sich vonlocation.replace
?Das Obige scheint das zu tun, wonach Sie suchen.
quelle
window.location.replace(('' + window.location).split('#')[0] + '#' + hash);
um nur den Hash zu aktualisieren<base href ="http://example.com/" />
Wenn es ein Basis-Tag enthält Wenn Sie dann die Ersetzungsmethode nur mit einem führenden verwenden"#hash_value_here"
, sieht es tatsächlich so aus, als hätten Sie "location.replace" (" example.com/#hash_value_here" ) gesagt . Dies scheint offensichtlich zu sein, wenn Sie es hier lesen, ist aber ein Problem, wenn Sie sich auf einer Seite mit einem Pfadfragment befinden und nicht wissen, dass die Basis festgelegt ist.Bearbeiten: Es ist jetzt ein paar Jahre her und Browser haben sich weiterentwickelt.
@ Luxiyalus Antwort ist der richtige Weg
- Alte Antwort -
Ich denke auch, dass es unmöglich ist (zu diesem Zeitpunkt). Aber warum müssen Sie den Hash-Wert ändern, wenn Sie ihn nicht verwenden möchten?
Ich glaube, der Hauptgrund, warum wir den Hash-Wert als Programmierer verwenden, besteht darin, dass der Benutzer unsere Seiten mit einem Lesezeichen versehen oder einen Status im Browserverlauf speichern kann. Wenn Sie dies nicht tun möchten, speichern Sie einfach den Status in einer Variablen und arbeiten Sie von dort aus.
Ich denke, dass der Grund für die Verwendung eines Hashs darin besteht, mit einem Wert zu arbeiten, der außerhalb unserer Kontrolle liegt. Wenn Sie es nicht benötigen, bedeutet dies wahrscheinlich, dass Sie alles unter Ihrer Kontrolle haben. Speichern Sie den Status einfach in einer Variablen und arbeiten Sie damit. (Ich wiederhole mich gerne)
Ich hoffe das hilft dir weiter. Vielleicht gibt es eine einfachere Lösung für Ihr Problem.
UPDATE: Wie wäre es damit:
window.history.back(1)
, wird der Verlauf von Ihrem ersten Init-Hash zurückgesetzt.Sie müssen wahrscheinlich einige Flags verwenden, um zu wissen, ob der aktuelle Eintrag durch Zurückgehen "gelöscht" werden kann, oder ob Sie nur den ersten Schritt überspringen. Und um sicherzustellen, dass Ihre Lademethode für den "Hash" nicht ausgeführt wird, wenn Sie das erzwingen
history.back
.quelle
?mystate=greatness
) einrichten. Auch wenn es sich nicht um Ajax handeln muss, können Sie Informationen speichern, die das Javascript beim Initialisieren der Anforderung lesen kann.Sie können jederzeit einen Ereignis-Listener erstellen, um Klickereignisse im Hyperlink abzufangen, und in der Rückruffunktion e.preventDefault () eingeben, um zu verhindern, dass der Browser sie in den Verlauf einfügt.
quelle