Изменить хэш без перезагрузки в jQuery
У меня есть следующий код:
$('ul.questions li a').click(function(event) {
$('.tab').hide();
$($(this).attr('href')).fadeIn('slow');
event.preventDefault();
window.location.hash = $(this).attr('href');
});
Это просто приводит к исчезновению div в зависимости от того, когда вы нажимаете, но я хочу, чтобы тэг hash-страницы страницы изменялся, когда вы нажимаете, чтобы люди могли копировать и добавлять закладки. На данный момент это эффективно перезагружает страницу при изменении хэш-тега.
Можно ли изменить хэш-тег и не перезагружать страницу, чтобы предотвратить эффект прыжка?
Ответы
Ответ 1
Это работает для меня
$('ul.questions li a').click(function(event) {
event.preventDefault();
$('.tab').hide();
window.location.hash = this.hash;
$($(this).attr('href')).fadeIn('slow');
});
Отметьте http://jsbin.com/edicu для демонстрации с почти идентичным кодом
Ответ 2
Вы можете попробовать поймать событие onload. И остановка распространения зависит от некоторого флага.
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;
}
}
Не тестировался, поэтому не могу сказать, будет ли это работать
Ответ 3
Принятый ответ не сработал у меня, так как моя страница слегка подпрыгнула, щелкнув мою анимацию прокрутки.
Я решил обновить весь URL, используя window.history.replaceState
, а не используя метод window.location.hash
. Таким образом, обход события hashChange, запущенного браузером.
// 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);
}
}
});
Ответ 4
Вы можете просто присвоить ему новое значение следующим образом:
window.location.hash
Ответ 5
Вы также можете установить свой хэш непосредственно на URL.
window.location.hash = "YourHash";
The result: http://url#YourHash