3

要以編程方式設置URL散列(#)(與手動更改URL對比)時,要防止反饋循環,我想暫時禁用hashChange偵聽器。以編程方式更新散列時禁用hashchange偵聽器(jQuery BBQ)

如何更改此代碼以在使用$.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; 
    }, 

回答

0

的hashchange事件觸發asyncrounously,hashChangeEnabled已經重置爲真,在事件處理程序的代碼執行時。您應該重置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); 
} 

或者用setTimeout的重置hashChangeEnabled(等待hashchange事件火,如果哈希改變了)

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

問題是,BBQ並不檢查新狀態是否真的不同。所以,如果我推入相同的狀態,hashChangeEnabled將被設置爲「false」,而不會重置爲「true」,因爲您在hashchange偵聽器中執行該操作時永遠不會觸發。謝謝! – dani 2011-06-09 14:51:25

+0

修改了我的答案 – dioslaska 2011-06-10 09:41:59