Ответ 1
Во-первых, я показываю определение функции replaceHash
, которое принимает только один аргумент: новый хэш местоположения. Подробное объяснение логики можно найти в нижней части ответа.
код:
// Should be executed BEFORE any hash change has occurred.
(function(namespace) { // Closure to protect local variable "var hash"
if ('replaceState' in history) { // Yay, supported!
namespace.replaceHash = function(newhash) {
if ((''+newhash).charAt(0) !== '#') newhash = '#' + newhash;
history.replaceState('', '', newhash);
}
} else {
var hash = location.hash;
namespace.replaceHash = function(newhash) {
if (location.hash !== hash) history.back();
location.hash = newhash;
};
}
})(window);
// This function can be namespaced. In this example, we define it on window:
window.replaceHash('Newhashvariable');
Логика функций
- Когда поддерживается
history.replaceState
, функция всегда будет заменять текущий хеш без каких-либо побочных эффектов. -
В противном случае создается ссылка (
hash
) на самое первое свойствоlocation.hash
и определяется следующая функция:- Если
location.hash != hash
, то мы точно знаем, что состояние истории, по крайней мере, прошло за первой страницей. Мы можем безопасно вернуться в историю, не выгружая страницу.history.back(); // Go back in the history
. - Затем установите свойство
location.hash
. Если мы вернемся в историю на предыдущем шаге, запись истории будет перезаписана.
Метод возврата (последний) не всегда может заменить историю:
Когдаlocation.hash == hash
, выполняется одно из следующих условий:- Хэш еще не изменился, поэтому нет смысла возвращаться к предыдущей странице.
- Возможно, пользователь перешел назад, в исходное состояние страницы. Если мы используем
history.back();
, страница может быть выгружена, что нежелательно.
Итак, чтобы быть безопасным, мы никогда не выгружаем страницу, когда хеш равен сохраненному исходному хэшу.Примечание. Важно выполнить этот код перед изменением хэша. Когда хэш уже был изменен, script больше не надежен. Пользователь мог перейти к самому первому состоянию хеширования, которое не равно сохраненному
hash
. Следовательно,history.back()
выгружает страницу. - Если