Отключение слушателя hashchange при программном обновлении hash (jQuery BBQ) - PullRequest
3 голосов
/ 09 июня 2011

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

Как мне изменить этот код, чтобы фактически отключитьсобытие hashchange при обновлении хеша с использованием $. bbq.pushState (hash) ?(код ниже не работает)

hashChangeEnabled : true,

bindHashChange : function(){
        var that = this;

        $(window).bind( 'hashchange', function( event ) {
            if(that.hashChangeEnabled == true){
                stateObj = event.getState() 
                that.stateChangedHandler(stateObj);
            }
        });

    },



updateURL : function(hash){
        this.hashChangeEnabled = false; // <--- Look here 
        $.bbq.pushState(hash);
        this.hashChangeEnabled = true;
    }, 

1 Ответ

0 голосов
/ 09 июня 2011

Событие hashchange происходит асинхронно, hashChangeEnabled уже сбрасывается в true, когда код в обработчике событий выполняется.Вы должны сбросить ваш hashChangeEnabled в событии hashchange:

if(that.hashChangeEnabled == true){
  stateObj = event.getState() 
  that.stateChangedHandler(stateObj);
}
else {
  that.hashChangeEnabled = true;
}

В вашей функции updateURL вы можете проверить, изменился ли хэш:

if (hash !== $.param.fragment()) {
  this.hashChangeEnabled = false;
  $.bbq.pushState(hash);
}

Или сбросить hashChangeEnabled с помощью setTimeout (дождитесьсобытие hashchange, если срабатывает изменение hash)

this.hashChangeEnabled = false;
$.bbq.pushState(hash);
setTimeout(function() { this.hashChangeEnabled = true; }, 500);
...