2011-11-25 3 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 바인딩은 두 번 발생합니다. 제 2의 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는 같은 요소에 바인드 된 오더 이벤트 핸들러가 실행되므로 어떤 핸들러가 먼저 호출되는지 알 수있는 확실한 방법이 없습니다. * " – Matt

+0

은 one()과"propgrations "모두에 대한 바인딩을 시도 했으므로 하나의 이벤트 만 발생합니다 해고당한 후 그 기능은 침묵한다. 도움이되지 않습니다. "hashChange에 한 번"발사해야하기 때문에 – frequent