Изменить хеш без запуска события 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;
}
Ответы
Ответ 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