Могу ли я обновить окно.Расположение.хэширование без прокрутки веб-страницы?
-
22-07-2019 - |
Вопрос
Используя JavaScript, есть ли способ обновить window?Расположение.хэширование без прокрутки веб-страницы?
У меня есть кликабельные элементы заголовка, которые переключают видимость div непосредственно под ними.Я хочу, чтобы строка /foo # отображалась в истории при нажатии на заголовки, но не хочу, чтобы страница прокручивалась.Таким образом, при переходе от / foo #bar я смогу использовать кнопку "Назад" и иметь div, идентификатор которого находится в window.Расположение.хэш будет виден по возвращении.
Возможно ли такое поведение?
Решение
Такое поведение очень возможно. Вам следует ознакомиться с некоторыми библиотеками, которые были разработаны для предоставления вам этой функциональности.
Действительно простая история: http://code.google.com/p/reallysimplehistory/а> SWFAddress: http://www.asual.com/swfaddress/
Другие советы
Чтобы изменить хэш без перезагрузки / прокрутки страницы, теперь вы можете просто использовать html5 history.pushState
.
history.pushState(null,null,'#hashexample');
Он поддерживается всеми основными браузерами:
MDN:
Также обратите внимание, что последний параметр url, который мы здесь используем, это может быть любой URL, поэтому он не ограничивается хэшами.
Так легко, как только можно
var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
Еще одна вещь, которую вы можете попробовать - это временно изменить идентификатор элемента, на который указывает хеш. Работал на меня!
function changeHashWithoutScrolling(hash) {
var id = hash.replace(/^.*#/, ''),
elem = document.getElementById(id)
elem.id = id+'-tmp'
window.location.hash = hash
elem.id = id
}
Хотел добавить комментарий к ответу Екатерины, но у меня пока нет представителя -
Отличное решение, однако в Chrome у меня не получилось, так как $ ('html'). scrollTop () всегда возвращает 0 - незначительное редактирование решает проблему:
scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
Основываясь на ответе Санни, я сделал эту функцию, которая также избегает неопределенных и нулевых значений:
function changeHashWithoutScrolling(hash) {
var id;
var elem;
id = hash.replace(/^.*#/, '');
if (id) {
elem = document.getElementById(id);
if (elem) {
elem.id = id + '-tmp';
window.location.hash = hash;
elem.id = id;
}
}
}