Подтвердить что ты не робот

Изменить хеш без запуска события hashchange

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

Лучшее решение, которое я придумал, - отменить событие hashchange, внести изменения, а затем переустановить его. Однако, поскольку это происходит асинхронно, я нахожу, что он слишком быстро перескакивает и все еще ловит хэш-изменение.

Мое решение на данный момент очень плохое: пересылка в setTimeout. Кто-нибудь имеет лучшую идею?

    $(window).unbind( 'hashchange', hashChanged);
    window.location.hash  = "!" + url;
    setTimeout(function(){
        $(window).bind( 'hashchange', hashChanged);
    }, 100);


Edit:
Предложение Amir Raminfar подсказывало мне решение, которое не требует тайм-аута. Я добавил переменную класса

_ignoreHashChange = false;

Когда я хочу тихо менять хэш, я делаю это:

_ignoreHashChange = true;
window.location.hash  = "!" + url;

и событие с изменением хэша делает следующее:

function hashChanged(event){
    if(_ignoreHashChange === false){
        url = window.location.hash.slice(2);
        fetchContent(url);
    }
    _ignoreHashChange = false;
}
4b9b3361

Ответ 1

У вас может быть такая функция:

function updateHash(newHash){
  ...
  oldHash = newHash
}

то в вашем setTimeOut вам нужно сделать

function(){
  if(oldHash != currenHash){
    updateHash(currenHash);
  }
}

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

Кстати, посмотрел ли вы плагин истории jquery? http://tkyk.github.com/jquery-history-plugin/

Ответ 2

Вы можете использовать history.replaceState и добавить хеш для замены текущего URI без запуска события hashchange:

var newHash = 'test';

history.replaceState(null, null, document.location.pathname + '#' + newHash);

Пример JSFiddle