2010-08-10 7 views
1

해당 div 외에 아무것도 클릭하면 div 닫을 jQuery 클릭 함수를 만들려고합니다. 내 문제는 검색 필드와 거기에있는 다른 버튼을 클릭하면 열려 있어야합니다.jQuery 선택기 :이 div가 아닌 해당 div

$("*:not(#header)").click(function() { 
    $('#header').slideUp({ 
     duration: 550, 
     easing: 'easeOutExpo' 
    }); 
}); 

가 나는 또한하고 싶은 말 '과'#categoryMore '하지 않고'#headerSearch '아니다 "하지만 내가 사용했던 구문이 작동되지 않은 :

나의 현재 기능입니다.

$("*:not(#header, #categoryMore, #headerSearch)") 

$("*:not(#header), *:not(#categoryMore), *:not(#headerSearch)") 

어떤 아이디어? 도와 줘서 고마워!

+1

나는 'patrick dw'가 올바른 방향에 있다고 믿지만, HTML 마크 업은 그 답을 구체적으로 볼 수있어서 좋을 것이다. –

+0

올바르게 이해했다면 헤더가 숨겨져있을 때 숨기고 싶지 않은 요소가 헤더에 있습니다. 그럴까요? –

+0

j-man86 - 글쎄, 당신이하는 일이 무엇이든, 당신은'$ ("* : not (#header)")'를 사용하여 페이지의 거의 모든 * 요소에 핸들러를 추가하기를 원하지 않습니다. 대단히 비효율적이며 실제로 사용되어서는 안됩니다. 어쩌면 그게 내 해결책으로 얻은 문제 야. 그 선택자를 제거해야합니다. – user113716

답변

3

편집 :

여기에 테스트 할 수있는 예입니다. http://jsfiddle.net/yvFcz/

예제에서는 slideToggle()을 사용 했으므로 두 번 이상 더 쉽게 테스트 할 수 있습니다.


#header을 닫는 document에 핸들러를 넣습니다.

#header에 처리기를 배치하고 event.stopPropagation()을 클릭하면 문서 내부를 클릭 할 때 이벤트가 버블 링되지 않습니다.

$(document).click(function() { 
    $('#header:visible').slideUp({ 
     duration: 550, 
     easing: 'easeOutExpo' 
    }); 
}); 

$('#header').click(function(event) { 
    event.stopPropagation(); 
}); 

참고 페이지의 다른 요소는 event.stopPropagation() 또는 return false;, 이벤트하지 않습니다 문서까지 거품하고 #header원를 사용하는 클릭 핸들러가있는 경우 닫지 마라.

그런 경우 해당 핸들러에서 직접 처리해야합니다.

+0

그 트릭을하지 않는 것 같아요 –

+0

@ j-man86 - 여기에 예제가 있습니다. (이 예제는 대신'slideToggle()'을 사용합니다.) http://jsfiddle.net/yvFcz/ 작동하지 않는 것은 무엇입니까? '# header'가 움직이지 않는다고 말하는 겁니까? 또는'# header'를 클릭하면 슬라이드가 가능합니까? – user113716

+0

sry :) ... 지정하려면 #header div 안쪽을 클릭해도 여전히 슬라이드됩니다. –

1

사용할 수 jQuery outside events JQuery와 플러그인이 있습니다 : jQuery를 외부 이벤트와

는 할 수 있습니다 특정 "원래"이벤트가 외부 발생하면 만 트리거됩니다 이벤트에 바인드 문제의 요소. 예를 들어, 외부를 클릭하고 바깥 쪽을 두 번 클릭하고 바깥 쪽을 마우스로 가리킨 다음 바깥쪽에 포커스를 놓습니다 (기본값은 "바깥 쪽"이벤트). 또한 외부 이벤트가 기본적으로 제공되지 않은 경우 을 쉽게 정의 할 수 있습니다.

1

난 당신이 jQuery not()를 사용할 수 있다고 생각하며이 같이 간단 할 수있다 : 이것은 당신이 #header 이외의 아무 곳이나 클릭하고 작업이 트리거 될 수 있습니다

$(document).not('#header, #categoryMore, #headerSearch').click(function() { 
    $('#header').slideToggle({ 
     duration: 550, 
     easing: 'easeOutExpo' 
    }); 
}); 

. 다른 .click() 이벤트 및 전파에 대해 걱정할 필요가 없습니다. 적어도 내 지식은 아님 ... #header, #categoryMore,#headerSearch을 선택하면 안됩니다.

바깥 쪽을 클릭 할 때마다 jQuery slideToggle()을 사용하여 머리글과 그 내용을 위아래로 슬라이드 할 수 있습니다. 단지 숨기고 싶다면 지금 .slideUp()을 사용하십시오 :)

희망이 있습니다.

+0

Hristo - 그런 식으로'.not()'을 사용하는 것은 실제로 아무 것도하지 않습니다. '.not()'메서드는 주어진 selector와 일치하는 * set * 요소를 제거하는 수단이다. '$ (document)'는 하나의 요소 ('document') 만 반환하고 그 요소는'.not()'에 주어진 선택자와 일치하지 않으므로 아무 것도 변경되지 않습니다. – user113716

+0

@patrick dw ... OK 나는 그 사실을 알지 못했지만 여전히 jQuery를 처음 사용하는 사람이다. '$ (document)'를 대체 할 것에 대한 제안이 있습니까? 우리는 작업 할 수있는 소스 코드가별로 없기 때문에 처음부터 함께 사용했습니다. – Hristo

+0

Hristo - 글쎄, 만약 당신이'.not()'을 사용했다면, 선택자는'$ ('*')'를 사용하여 페이지의 * 모든 * 요소를 선택해야 할 것입니다. 그런 다음'.not()'은 그 중 소수만 걸러냅니다. ** 그러나 이것을하지 마십시오. ** 모든 요소에 핸들러를 추가하는 것은 대단히 비효율적입니다. 'document'에만 핸들러를 놓고'click' 이벤트를 자연스럽게 버블시키고 핸들러를 작동시키는 것이 낫습니다. – user113716