Ответ 1
Удалите привязку, к которой вы собираетесь перемещаться, затем используйте подход № 2? Поскольку нет привязки, установка хеша не должна прокручивать страницу.
Я пытаюсь перезагрузить текущую страницу с другим хешем URL, но он не работает должным образом.
(Уточнение, как я хочу, чтобы он работал: перезагрузите страницу, а затем перейдите к новому хешу.)
Подход №1:
window.location.hash = "#" + newhash;
Прокручивает только этот якорь без перезагрузки страницы.
Подход № 2:
window.location.hash = "#" + newhash;
window.location.reload(true);
Kinda работает, но он сначала прокручивается до привязки, затем перезагружает страницу, затем снова прокручивается к якорю.
Подход № 3:
window.location.href = window.location.pathname + window.location.search + "&random=" + Math.round(Math.random()*100000) + "#" + newhash;
Работает, но я бы предпочел не добавлять случайный мусор к URL-адресу.
Есть ли лучшее решение?
Удалите привязку, к которой вы собираетесь перемещаться, затем используйте подход № 2? Поскольку нет привязки, установка хеша не должна прокручивать страницу.
У меня была функция JQuery, запущенная на $(document).ready()
, которая обнаружила, что в моем случае был добавлен хэш, добавленный к URL-адресу, поэтому я сохранил эту функцию одинаково, а затем просто использовал перезагрузку при каждом изменении хэша:
$(window).on('hashchange',function(){
window.location.reload(true);
});
Тогда моя другая функция -
$(document).ready(function() {
var hash = window.location.hash;
if(hash) {
//DO STUFF I WANT TO DO WITH HASHES
}
});
В моем случае это было хорошо для UX - возможно, это не хорошо для других.
Следует ожидать, что #foo будет прокручиваться до якоря id, "foo". Если вы хотите использовать подход №1 и перезагрузить его, этот подход может работать.
if (Object.defineProperty && Object.getOwnPropertyDescriptor) { // ES5
var hashDescriptor = Object.getOwnPropertyDescriptor(location, "hash"),
hashSetter = hashDescriptor.set;
hashDescriptor.set = function (hash) {
hashSetter.call(location, hash);
location.reload(true);
};
Object.defineProperty(location, "hash", hashDescriptor);
} else if (location.__lookupSetter__ && location.__defineSetter__) { // JS
var hashSetter = location.__lookupSetter__("hash");
location.__defineSetter__("hash", function (hash) {
hashSetter.call(location, hash);
location.reload(true)
});
}
Другой вариант - удалить хэш и сохранить его в хранилище сеансов, которое будет загружено при перезагрузке:
var newUrl = location.href + '#myHash';
var splitUrl = newUrl.split('#');
newUrl = splitUrl[0];
if (splitUrl[1]){
sessionStorage.savedHash = splitUrl[1];
}
location.href = newUrl;
а затем поверх вашей страницы вы можете получить следующий код:
var savedHash = sessionStorage.savedHash;
if (savedHash){
delete sessionStorage.savedHash;
location.hash = savedHash;
}