Обновлять хеш программно, не вызывая событие hashchange? - PullRequest
8 голосов
/ 14 августа 2011

Я использую плагин jQuery BBQ для отправки состояний в location.hash.

Чтобы предотвратить петлю обратной связи, я бы хотел временно отключить прослушиватель hashchange при настройке состояния программно.

Я видел это решение: Изменение хэша без запуска события хеширования

К сожалению, он не выглядит достаточно надежным, так как иногда срабатывает, даже если я делаю это:

updateURL(obj){
  $(window).unbind( 'hashchange');
  $.bbq.pushState(obj);
  setTimeout( function() { bindHashChange()}, 500);
}

Есть ли сейчас лучший подход к программному продвижению состояний? Возможно, другая библиотека JS?

1 Ответ

2 голосов
/ 14 августа 2011

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

Кроме того, можно привязать временный обработчик к событию, которое отвечает за восстановление вашего обработчика:

function updateState(state, handler) {
    var win = $(window);

    function temporaryHandler() {
        win.unbind('hashchange', temporaryHandler);
        win.bind('hashchange', handler);
    };

    win.unbind('hashchange', handler);
    win.bind('hashchange', temporaryHandler);

    $.bbq.pushState(state);
}
...