为了防止在以编程方式设置URL哈希(#)时出现反馈循环(与手动更改URL相反),我想暂时禁用hashChange监听器。

使用$.bbq.pushState(hash)更新哈希时,应如何更改此代码以实际禁用hashchange事件? (下面的代码不起作用)

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;
    },

最佳答案

当事件处理程序中的代码执行时,hashchange事件异步触发,hashChangeEnabled已重置为true。您应该在hashchange事件中重置hashChangeEnabled:

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);
}

或使用setTimeout重置hashChangeEnabled(如果哈希更改,则等待hashchange事件触发)
this.hashChangeEnabled = false;
$.bbq.pushState(hash);
setTimeout(function() { this.hashChangeEnabled = true; }, 500);

关于javascript - 以编程方式更新哈希(jQuery BBQ)时禁用hashchange监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6290950/

10-08 23:35