Можете ли вы использовать хеш-навигацию, не влияя на историю?

Я боюсь, что это возможно невозможно, но есть способ изменить хеш-значение 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) не сохраняя вкладку, в которой они сейчас находятся, если они попадают в обновление раздражение.

Ответ 1

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

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

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

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

Ответ 2

location.replace("#hash_value_here"); 

Выше, похоже, делает то, что вам нужно.

Ответ 3

Изменить: Прошло уже пару лет, и браузеры эволюционировали.

@Luxiyalu answer - это путь

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

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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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