Как я могу удалить хэш местоположения, не заставляя прокручивать страницу?
Можно ли удалить хэш из window.location
, не заставляя страницу перескакивать вверх? Мне нужно иметь возможность изменять хэш без каких-либо переходов.
У меня есть это:
$('<a href="#123">').text('link').click(function(e) {
e.preventDefault();
window.location.hash = this.hash;
}).appendTo('body');
$('<a href="#">').text('unlink').click(function(e) {
e.preventDefault();
window.location.hash = '';
}).appendTo('body');
См. пример в реальном времени: http://jsbin.com/asobi
Когда пользователь нажимает " ссылка", хэш-тег изменяется без каких-либо переходов страницы, поэтому работа прекращается.
Но когда пользователь нажимает " unlink", тег hase удаляется, а прокрутка страницы - вверх. Мне нужно удалить хэш без этого побочного эффекта.
Ответы
Ответ 1
Я верю, что если вы просто введете фиктивный хеш, он не будет прокручиваться, поскольку нет прокрутки для прокрутки.
<a href="#A4J2S9F7">No jumping</a>
или
<a href="#_">No jumping</a>
"#"
сам по себе эквивалентен "_top"
, поэтому вызывает прокрутку вверху страницы
Ответ 2
Я использую следующее на нескольких сайтах, NO PAGE JUMPS!
Хорошая чистая адресная строка для дружественных HTML5 браузеров и всего лишь # для старых браузеров.
$('#logo a').click(function(e){
window.location.hash = ''; // for older browsers, leaves a # behind
history.pushState('', document.title, window.location.pathname); // nice and clean
e.preventDefault(); // no page reload
});
Ответ 3
Свойство hash window.location является глупым несколькими способами. Это один из них; другой - то, что имеет разные значения get и set:
window.location.hash = "hello"; // url now reads *.com#hello
alert(window.location.hash); // shows "#hello", which is NOT what I set.
window.location.hash = window.location.hash; // url now reads *.com##hello
Обратите внимание, что установка свойства hash на '' также удаляет хэш-метку; что перенаправляет страницу. Чтобы установить значение хэш-части URL-адреса на '', оставив хеш-метку и, следовательно, не обновляясь, напишите это:
window.location.href = window.location.href.replace(/#.*$/, '#');
Невозможно полностью удалить метку хэша после установки без обновления страницы.
ОБНОВЛЕНИЕ 2012:
Как отметил Blazemonger и thinkdj, технология улучшилась. Некоторые браузеры позволяют вам очистить хэштег, но некоторые из них этого не делают. Чтобы поддержать оба варианта, попробуйте что-то вроде:
if ( window.history && window.history.pushState ) {
window.history.pushState('', '', window.location.pathname)
} else {
window.location.href = window.location.href.replace(/#.*$/, '#');
}
Ответ 4
Это старый пост, но я хотел поделиться своим решением
Все ссылки в моем проекте, которые обрабатываются JS, имеют атрибут href= "#_ js" (или любое другое имя, которое вы хотите использовать только для этих целей), и при инициализации страницы я делаю:
$('body').on('click.a[href="#_js"]', function() {
return false;
});
Это будет трюк
Ответ 5
Я не уверен, что это даст желаемый результат, сделайте снимок:
$('<a href="#">').text('unlink').click(function(e) {
e.preventDefault();
var st = parseInt($(window).scrollTop())
window.location.hash = '';
$('html,body').css( { scrollTop: st });
});
В основном сохранить смещение прокрутки и восстановить его после назначения пустого хеша.
Ответ 6
Вы пробовали return false;
в обработчике событий? jQuery делает что-то особенное, когда вы делаете это, аналогично, но AFAIK более эффективен, чем e.preventDefault
.
Ответ 7
Установка window.location.hash для пустого или несуществующего имени привязки всегда заставит страницу перейти вверх. Единственный способ предотвратить это - захватить положение прокрутки окна и снова установить его в эту позицию после изменения хэша.
Это также приведет к перерисовке страницы (не удастся ее избежать), хотя, поскольку она выполняется в одном js-процессе, она не будет прыгать вверх/вниз (теоретически).
$('<a href="#123">').text('link').click(function(e) {
e.preventDefault();
window.location.hash = this.hash;
}).appendTo('body');
$('<a href="#">').text('unlink').click(function(e) {
e.preventDefault();
var pos = $(window).scrollTop(); // get scroll position
window.location.hash = '';
$(window).scrollTop(pos); // set scroll position back
}).appendTo('body');
Надеюсь, что это поможет.
Ответ 8
Надеюсь, что это поможет
HTML
<div class="tabs">
<ul>
<li><a href="#content1">Tab 1</a></li>
<li><a href="#content2">Tab 2</a></li>
<li><a href="#content3">Tab 3</a></li>
</ul>
</div>
<div class="content content1">
<p>1. Content goes here</p>
</div>
<div class="content content2">
<p>2. Content goes here</p>
</div>
<div class="content content3">
<p>3. Content goes here</p>
</div>
JS
function tabs(){
$(".content").hide();
if (location.hash !== "") {
$('.tabs ul li:has(a[href="' + location.hash + '"])').addClass("active");
var hash = window.location.hash.substr(1);
var contentClass = "." + hash;
$(contentClass).fadeIn();
} else {
$(".tabs ul li").first().addClass("active");
$('.tabs').next().css("display", "block");
}
}
tabs();
$(".tabs ul li").click(function(e) {
$(".tabs ul li").removeAttr("class");
$(this).addClass("active");
$(".content").hide();
var contentClass = "." + $(this).find("a").attr("href").substr(1);
$(contentClass).fadeIn();
window.location.hash = $(this).find("a").attr("href");
e.preventDefault();
return false;
});
URL без хеша.
http://output.jsbin.com/tojeja
URL с хэштегом, который не перескакивает на якорь.
http://output.jsbin.com/tojeja#content1