2010-04-27 6 views
5

jQuery에서 열리는 링크를 클릭 할 때 메뉴가 있지만, 다른 곳을 클릭하면 메뉴가 아닌 다른 곳을 클릭하면 숨겨집니다. 순간 가장 좋은 방법은 jQuery가 아닌가?

내가

$(':not(#the_menu)') 

에 클릭 이벤트를 바인딩하고있어하지만 전체 뺀 메뉴에 클릭 이벤트를 바인딩 것 같은이 보인다, 같은 일을하고 좀 더 효율적인 방법이있다 이?

답변

7

이 작업을 수행하는 가장 좋은 방법은 다음과 같이 버블 캡처 함께이 어떻게 작동

$(document).click(function() { 
    //close menu 
}) 

$("#the_menu").click(function(e) { 
    e.stopPropagation(); 
}); 

가 (당신이 return false; 또는 event.stopPopagation()에 의해 일반적으로 중지하지 않는 한), 그래서 당신은 거품을 클릭 무엇이든 모든 클릭 거품이다 모든 DOM까지 ... 클릭하면 메뉴가 닫힙니다. 에서 메뉴 인 경우 메뉴가 나오면 버블을 멈 춥니 다. 그러면 클릭이 위로 올라 오지 않아 닫힙니다. 이 방법은 모두 이지만 메뉴가이므로 매우 가벼운 2 개의 이벤트 처리기 만 사용합니다.

+0

Woops에는 "전파"가 있었고, 고정되었습니다. –

+0

와우, 멋지다. 건배. 모든 브라우저에서 이벤트 버블 링을 확인해야 할 필요가 있습니다. 비키십시오. – Smickie

+0

@Smickie - 다행스럽게도 jQuery는 버블 링을 매우 잘 (정규화 된 예외는 거의 없음) 정상화하므로 '클릭'이 일관되게 작동합니다. 조심해야 할 큰 변화는'change '가 IE에서 올바르게 버블 링되지 않아서 .live ("change", ..) 문제가 발생한다는 것입니다. –

0

이벤트를 문서 본문 ($(body))에 연결합니다. 또한 #the_menu에 다른 이벤트를 연결하는의 블록 이벤트 전파 :

$(document.body).click(function() { 
    //close menu if opened 
}); 

$("#the_menu").click(function(e) { 
    //code heere 

    e.stopPropagation(); 
}); 
0

방법이 포함되어있는 요소 위에 마우스로 메뉴 표시를 바인딩에 대해?

$("#parentId").hover(
    function() { //!! on hovering in 
     $("#targetId").attr("display","block") ; 
    } , 
    function() { //!! on hovering out 
     $("#targetId").attr("display","none") ; 
    } 
) ; 

목표에 부합한다면 유지 관리가 더 쉬운 것처럼 보입니다.