Я использую хеш для динамической загрузки контента.Чтобы заставить работать кнопку возврата, я фиксирую изменения хеша.Однако иногда мне нужно изменить хеш, не вызывая функцию изменения хеша (например, когда страница была перенаправлена на серверную сторону, и мне нужно обновить хеш после возвращения содержимого.)
Лучшее решение, которое я нашелВ итоге нужно отменить привязку события 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;
}