Как я могу удалить хэш местоположения, не вызывая прокрутку страницы?
можно ли удалить хэш из 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' тег has удаляется, и прокрутка страницы переходит к началу. Мне нужно удалить хэш без этого побочного эффекта.
8 ответов:
Я считаю, что если вы просто поместите в фиктивный хэш, он не будет прокручиваться, так как нет совпадения для прокрутки.
<a href="#A4J2S9F7">No jumping</a>
или
<a href="#_">No jumping</a>
"#"
само по себе эквивалентно"_top"
таким образом, вызывает прокрутку в верхней части страницы
Я использую следующее на нескольких сайтах, никаких скачков страницы!
хорошая чистая адресная строка для дружественных браузеров 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 });
окно.свойство хэша местоположения глупо в нескольких отношениях. Это один из них; другой - это то, что имеет разные значения 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(/#.*$/, '#'); }
Это старый пост, но я хотел поделиться своим решением Все ссылки в моем проекте, которые обрабатываются JS, имеют атрибут href="#_js" (или любое другое имя, которое вы хотите использовать только для этих целей), а при инициализации страницы я делаю:
$('body').on('click.a[href="#_js"]', function() { return false; });
это сделает трюк
Окно настроек.местоположение.хэш для пустого или несуществующего имени привязки, всегда будет заставлять страницу прыгать вверх. Единственный способ предотвратить это-захватить положение прокрутки окна и снова установить его в это положение после изменения хэша.
Это также заставит перекрасить страницу (не могу избежать этого), хотя, поскольку он выполняется в одном процессе 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');
надеюсь, что это помогает.
Я не уверен, что это дает желаемый результат, дайте ему шанс:
$('<a href="#">').text('unlink').click(function(e) { e.preventDefault(); var st = parseInt($(window).scrollTop()) window.location.hash = ''; $('html,body').css( { scrollTop: st }); });
в основном сохраните смещение прокрутки и восстановите его после назначения пустого хэша.
ты пробовал
return false;
в обработчике событий? jQuery делает что-то особенное, когда вы это делаете, похоже, но AFAIK более впечатляющий, чемe.preventDefault
.
надеюсь, что это помогает
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/tojejaURL с хэштегом, который не прыгает на якорь.
http://output.jsbin.com/tojeja#content1