строка - javascript событие изменения url




Как заставить страницу перезагрузиться, если все, что было изменено в URL-адресе,-это хэш? (3)

Я пытаюсь перезагрузить текущую страницу с другим хешем 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-адресу.

Есть ли лучшее решение?


Другой вариант - удалить хэш и сохранить его в хранилище сеансов, которое будет загружено при перезагрузке:

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;
}

Следует ожидать, что #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)
    });
}

Удалите привязку, к которой вы собираетесь перемещаться, затем используйте подход № 2? Поскольку нет привязки, установка хеша не должна прокручивать страницу.







reload