2011-11-25 54 views
4

我試圖讓我的hashChange事件綁定冒泡。如何確保綁定到hashChange事件不會冒泡?

我有這樣的:

$(window).bind('hashchange', function(e) { 
    console.log("hash fired"); 
    // run hashChange routine 
    }); 

我的腳本管理面板在頁面上具有它自己的歷史堆棧中的每個面板。上面的每個轉換都會觸發,但是我正在阻止hashChange轉換,所以我可以更深入地瀏覽面板。在向後「轉換」時,只有hashChange被觸發並且沒有被阻塞,所以我可以回去了。

導航可能是這樣的:

panel A, start down > page2 
panel A, page2 down > page3 
panel A, page3 up > page2 
panel A, page2 up > start - hashChange fires twice here... 

一切運作良好(= hashChange觸發一次),直到我在初始設置之前到達的頁面。在最後一步,上面的hashChange-binding會觸發兩次。我一直試圖設置一個標誌來阻止第二個hashChange,但它並不像我所希望的那樣工作。

問題:
如何確保這不泡?我想這樣的事情,但它不工作:

var $blockBubblingHashes = 0; 
$(window).bind('hashchange', function(e) {  
    if ($blockBubblingHashes == 0) { 
     // run hashChange routine 
     $blockBubblingHashes = 1; 
     } else { 
     $blockBubblingHashes = 0; 
     } 
    }); 

回答

2

如果你想在事件處理程序只啓動一次,你應該考慮使用one()功能,從而消除了處理它的第一個執行之後。

$(window).one('hashchange', function(e) {    
    console.log("hash fired"); 
    // run hashChange routine 
}); 

如果你特別想阻止事件冒泡,而不是刪除處理程序,你應該簽上方法stopPropagation()stopImmediatePropagation()事件對象。不幸的是,我得到的印象是您將所有hashchange處理程序綁定到window,並且jQuery沒有記錄綁定到相同元素的事件處理程序以何種順序執行;所以你沒有可靠的方法來知道哪個處理程序首先被調用。

+0

嘗試stopPropagation()。不知道這個...... – frequent

+0

@frequent:如果你將所有'hashchange'綁定到'window',你必須使用'stopImmediatePropagation()',但是「* jQuery沒有文檔order綁定到同一個元素的順序事件處理程序會被執行;所以你將沒有可靠的方法來知道哪個處理程序首先被調用。*「 – Matt

+0

嘗試綁定到一個()和兩個」propgrations「,都只導致一個事件在此之後,功能無聲。沒有幫助。因爲我需要它發射「每hashChange一次」 – frequent