Можете ли вы использовать хэш-навигацию, не влияя на историю? - PullRequest
94 голосов
/ 21 февраля 2010

Боюсь, что это может быть невозможно , но есть ли способ изменить значение хеш-адреса URL , не оставляя записи в истории браузера и без перезагрузки ? Или сделать эквивалент?

Что касается специфики, я разрабатывал базовую хеш-навигацию по направлениям:

//hash nav -- works with js-tabs
var getHash = window.location.hash;
var hashPref = "tab-";
function useHash(newHash) {
    //set js-tab according to hash
    newHash = newHash.replace('#'+hashPref, '');
    $("#tabs li a[href='"+ newHash +"']").click();
}
function setHash(newHash) {
    //set hash according to js-tab
    window.location.hash = hashPref + newHash;

    //THIS IS WHERE I would like to REPLACE the location.hash
    //without a history entry

}
    // ... a lot of irrelavent tabs js and then....

    //make tabs work
    $("#tabs.js-tabs a").live("click", function() {
        var showMe = $(this).attr("href");
        $(showMe).show();
        setHash(showMe);
        return false;
    });
    //hash nav on ready .. if hash exists, execute
    if ( getHash ){
        useHash(getHash);
    }

Использование jQuery, очевидно. Идея состоит в том, что в этом конкретном случае 1) заставить пользователя возвращаться к каждому изменению вкладки может эффективно «сломать кнопку назад», накапливая ненужные ссылки, и 2) не сохраняя, какую вкладку они в настоящее время на , если они нажимают обновить, раздражает.

Ответы [ 5 ]

94 голосов
/ 04 августа 2011
location.replace("#hash_value_here"); 

Выше, кажется, делать то, что вы ищете.

81 голосов
/ 29 мая 2014

location.replace("#hash_value_here"); работал нормально для меня, пока я не обнаружил, что он не работает на IOS Chrome. В этом случае используйте:

history.replaceState(undefined, undefined, "#hash_value")

history.replaceState () работает точно так же, как history.pushState (), за исключением того, что replaceState () изменяет текущую запись истории вместо создания новой.

Не забудьте сохранить #, иначе последняя часть URL будет изменена.

6 голосов
/ 21 февраля 2010

Редактировать: Прошла пара лет, и браузеры эволюционировали.

@ ответ Luxiyalu - это путь

- Старый ответ -

Я тоже думаю, что это невозможно (в настоящее время). Но зачем вам менять значение хеша, если вы не собираетесь его использовать?

Я полагаю, что основная причина, по которой мы используем значение хеш-функции в качестве программистов, состоит в том, чтобы позволить пользователю добавить в закладки наши страницы или сохранить состояние в истории браузера. Если вы не хотите делать ничего из этого, просто сохраните состояние в переменной и работайте оттуда.

Я думаю, что причина использования хэша заключается в работе со значением, которое находится вне нашего контроля. Если вам это не нужно, то это, вероятно, означает, что у вас все под контролем, поэтому просто сохраните состояние в переменной и работайте с ним. (Мне нравится повторяться)

Надеюсь, это поможет вам. Может быть, есть более простое решение вашей проблемы.

UPDATE: Как насчет этого:

  1. Настройте первый хеш и убедитесь, что он сохраняется в истории браузера.
  2. Когда будет выбрана новая вкладка, сделайте window.history.back(1), которая вернет историю из вашего первого хеша инициализации.
  3. Теперь вы устанавливаете новый хеш, поэтому табуляция сделает только одну запись в истории.

Возможно, вам придется использовать некоторые флаги, чтобы узнать, можно ли «удалить» текущую запись, вернувшись назад, или просто пропустите первый шаг. И чтобы убедиться, что ваш метод загрузки для «хэша» не выполняется, когда вы заставляете history.back.

0 голосов
/ 04 февраля 2016
history.replaceState(undefined, undefined, "#profileInfo")

Где # profileInfo - ваш идентификатор.

0 голосов
/ 13 июня 2013

Вы всегда можете создать прослушиватель событий, чтобы перехватывать события щелчков по гиперссылке, и в функцию обратного вызова вставьте e.preventDefault (), что должно помешать браузеру вставить его в историю.

...