2009-07-18 3 views
2

나는 버튼이있는 경우 : 글로벌 선택기를 사용하여 하나의 요소를 제외한 모든 클릭 이벤트에 어떻게 대응합니까?

<button id="button1"> 

은 일반적으로 내가 작성합니다

$("#button1").click(function() 
{  
    //do something 
} 

을하지만 누군가가이 버튼을 클릭하면 제외한 모든 클릭 이벤트 에 응답하는 함수를 정의합니다.

button1을 제외한 문서의 다른 모든 클릭 가능한 요소를 타겟팅 할 수있는 선택 도구가 있습니까?

답변

6

나는 당신이 위의 대답을 받아 들였지만 나는 이것을 강력히 권고 할 것이라고 알고있다. 이벤트 위임을 사용하면 dom에 훨씬 적은 오버 헤드로 원하는 작업을 수행 할 수 있습니다.

.live()가 있지만 너무 많은 라이브 핸들러가 성능에 영향을줍니다. 나는 이벤트 위임 구식을 선호한다.

데모 here

$(function(){ 
    $('body').click(clickFn); 
    }); 

    function clickFn(ev) { 

    if (ev.target.id != 'button1'){ 
     //do your stuff 
     console.log('not a #button1 click'); 
    } 

    } 
+2

이벤트 위임은 live() -> http://docs.jquery.com/Events/live – James

+0

예와 함께 jQuery로 바로 구워집니다.하지만 자체 오버 헤드가 있습니다. – redsquare

+0

감사합니다. 내 코드에서 솔루션을 구현하기 시작했지만 사용 된 구문에 대해 혼란스러워합니다. 내 혼란을 명확히하기 위해 새로운 질문을 추가했습니다. http://stackoverflow.com/questions/1147864/correct-syntax-for-defining-an-event-delegator –

7

당신이 사용할 수있는 :not selector :

$('button:not(#button1)').click(function(){ 
    //Do something 
}); 

위의 선택은 ID = "Button1을"을 제외한 모든 버튼 요소를 일치합니다.

당신은 body 태그에서 모든 요소를 ​​선택 정말 원한다면, 당신은 "All" (*) 선택기를 사용하고, 또한 :not(selector) 또는 .not(expr)와 요소를 제외 할 수

$('body *:not(#button1)').click(function(){ 
    //Do something 
}); 

또는

$('body *').not('#button1').click(function(){ 
    //Do something 
}); 

이벤트 버블 링 또는 전파 문제가있을 수 있으므로 event.stopPropagation 기능으로 처리 할 수 ​​있습니다.

+0

멋진 대답. 감사. –

+0

안녕하세요. – CMS

+3

좋은 해결책은 아닙니다. 100 회의 클릭 이벤트가 발생할 수 있습니다. 이벤트 위임은 event.target을 확인하는 곳에서 가장 좋습니다. – redsquare

1

현재 CSS 3 선택자 후보 권고안은 :root pseuedo class을 정의합니다.

의사 클래스는 문서의 루트 요소를 나타냅니다. HTML 4에서는 항상 HTML 요소입니다.

이벤트 수신기를 루트에 연결 한 다음 어떤 요소가 클릭을 받았는지 확인할 수 있습니다. 요소를 반환하려는 경우 무시하고 그렇지 않으면 원하는대로 수행하십시오.

+0

후보 사양 인 경우 브라우저에 따라 소리가납니다. –

+0

jQuery와 같은 JavaScript 라이브러리에서 제공하는 선택기 엔진은 CSS 3 셀렉터를 구현합니다.jQuery에서 브라우저로 구현되지 않은 셀렉터를 아주 행복하게 사용할 수있다. –

+0

설명해 주셔서 감사합니다. 나는 이것이 그것이 어떻게 작동 하는지를 몰랐다. –