程序化更新哈希值时禁用哈希变化监听器(jQuery BBQ)

5
为了避免在编程时设置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;
    }, 
1个回答

1

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

问题在于BBQ没有检查新状态是否真的不同。因此,如果我推送相同的状态,hashChangeEnabled将被设置为“false”,并且不会重置为“true”,因为您是在hashchange侦听器中执行该操作,而该侦听器从未触发..!?谢谢! - dani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接