Как заменить хеш местоположения и сохранить только последнюю запись в истории? - PullRequest
14 голосов
/ 11 февраля 2012

Я использую плагин jQuery BBQ , чтобы отслеживать продвижение пользователей по странице.Однако я хочу создать только 1 дополнительную запись в истории пользователя, а не одну для каждого изменения хеша.

Я пробовал методы jQuery.bbq.pushState и merge_mode, но безуспешно: Новые записи истории все еще добавляются:

jQuery.bbq.pushState({ sort: encodeURIComponent(sort) });

Я также пробовал location.replace(), но это не работает для Safari 5.1.2.

location.replace('#' + encodeURIComponent(sort))

браузерное решение для изменения хэша без добавления слишком большого количества записей в историю?

Ответы [ 2 ]

34 голосов
/ 14 февраля 2012

Сначала я покажу определение функции 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 и определяется следующая функция:

    1. Если location.hash != hash, то мы точно знаем, что состояние истории, по крайней мере, прошло после первого просмотра страницы. Мы можем смело возвращаться в историю, не разгружая страницу. history.back(); // Go back in the history.
    2. Затем установите свойство location.hash. Если мы вернулись в историю на предыдущем шаге, запись истории будет перезаписана.


    Резервный (последний) метод не всегда может заменить историю:
    Когда location.hash == hash, выполняется одно из следующих условий:

    1. Хеш еще не изменился, поэтому нет смысла возвращаться на предыдущую страницу.
    2. Возможно, пользователь переместился назад, к исходному состоянию страницы. Если мы используем history.back();, страница может быть выгружена, что нежелательно.


    Итак, чтобы быть безопасными , мы никогда не выгружаем страницу, когда хэш равен сохраненному оригинальному хешу.

    Примечание. Важно запустить этот код перед изменением хэша. Когда хеш уже изменен, скрипт больше не является надежным. Пользователь мог перейти к самому первому состоянию хеширования, которое не равно сохраненному hash. Следовательно, history.back() выгружает страницу.

21 голосов
/ 24 июня 2013

Вы можете использовать replace -метод из window.location, без второго newSubStr -аргумента. Это работает во всех известных браузерах, даже oldIE:

function replaceHash(hash) {
  return window.location.replace(
    '#' + hash.replace(/^#/, '')
  );
}

Обратите внимание, что если в документе есть действительный элемент ( согласно спецификации ), страница перейдет к нему или перейдет к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...