Ich habe folgenden Code:
$('ul.questions li a').click(function(event) {
$('.tab').hide();
$($(this).attr('href')).fadeIn('slow');
event.preventDefault();
window.location.hash = $(this).attr('href');
});
Dies blendet einfach ein div ein, wenn Sie auf klicken, aber ich möchte, dass sich das Hash-Tag der Seiten-URL ändert, wenn Sie auf klicken, damit Benutzer es kopieren und mit einem Lesezeichen versehen können. Im Moment wird die Seite effektiv neu geladen, wenn das Hash-Tag geändert wird.
Ist es möglich, das Hash-Tag zu ändern und die Seite nicht erneut zu laden, um den Sprungeffekt zu verhindern?
Das funktioniert für mich
$('ul.questions li a').click(function(event) {
event.preventDefault();
$('.tab').hide();
window.location.hash = this.hash;
$($(this).attr('href')).fadeIn('slow');
});
Überprüfen Sie hier http://jsbin.com/edicu eine Demo mit nahezu identischem Code
Sie könnten versuchen, das Onload-Ereignis abzufangen. Und die Ausbreitung abhängig von einer Flagge.
var changeHash = false;
$('ul.questions li a').click(function(event) {
var $this = $(this)
$('.tab').hide(); //you can improve the speed of this selector.
$($this.attr('href')).fadeIn('slow');
StopEvent(event); //notice I've changed this
changeHash = true;
window.location.hash = $this.attr('href');
});
$(window).onload(function(event){
if (changeHash){
changeHash = false;
StopEvent(event);
}
}
function StopEvent(event){
event.preventDefault();
event.stopPropagation();
if ($.browser.msie) {
event.originalEvent.keyCode = 0;
event.originalEvent.cancelBubble = true;
event.originalEvent.returnValue = false;
}
}
Nicht getestet, kann also nicht sagen, ob es funktionieren würde
Sie können ihm einfach einen neuen Wert zuweisen,
window.location.hash
Die akzeptierte Antwort funktionierte nicht für mich, da meine Seite beim Klicken leicht aufsprang und meine Scroll-Animation durcheinander brachte.
Ich entschied mich dafür, die gesamte URL mit window.history.replaceState
zu aktualisieren, anstatt die window.location.hash
-Methode zu verwenden. Dadurch wird das vom Browser ausgelöste Ereignis hashChange umgangen.
// Only fire when URL has anchor
$('a[href*="#"]:not([href="#"])').on('click', function(event) {
// Prevent default anchor handling (which causes the page-jumping)
event.preventDefault();
if ( location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname ) {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
if ( target.length ) {
// Smooth scrolling to anchor
$('html, body').animate({
scrollTop: target.offset().top
}, 1000);
// Update URL
window.history.replaceState("", document.title, window.location.href.replace(location.hash, "") + this.hash);
}
}
});