Изменить хэш, не вызывая событие hashchange - PullRequest
47 голосов
/ 05 ноября 2010

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

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

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

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


Редактировать:
Предложение Амира Раминфара подтолкнуло меня к решению, которое не требует тайм-аута.Я добавил переменную класса

_ignoreHashChange = false;

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

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

, и событие изменения хэша делает это:

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

Ответы [ 2 ]

11 голосов
/ 06 июля 2017

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

var newHash = 'test';

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

Пример JSFiddle

6 голосов
/ 05 ноября 2010

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

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

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

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

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

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

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