2010-08-05 10 views
0

위젯이 다른 위젯에 대한 클릭을 수신 대기하지만 자체적으로 정상 클릭을 수신하지 못하게하려면 어떻게해야합니까? 예를 들어 :jquery namespaced events

var $dialogWidget = jQuery('#dialogWidget'); 

$dialogWidget 
    .bind('click.btn1.otherWidget',doSomething) 
    .bind('click.btn2.otherWidget',doSomething2) 
    .bind('click.btn1.otherWidget2',doSomething3); 

이 코드의 문제는 내가 $ dialogWidget의 아무 곳이나 클릭하면, 내가 구속 한이 모든 이벤트가 트리거 될 것입니다. 내가 원하는이

var $otherWidget = jQuery('#otherWidget'); 
var $btn1 = $otherWidget.find('a.btn1'); 
$btn1 
    .click(function(){ 
     $dialogWidget.trigger('click.btn1.otherWidget'); 
    }); 

이 'click.btn1.otherWidget'이벤트가 $ dialogWidget 해고되는 유일한 방법해야한다.

내가 할 수있는 가능한 한 가지 방법은 클릭 이벤트를 수동으로 발사 할 때마다 클릭 대신 '클릭'을 사용하는 것이지만 해킹과 같은 느낌입니다. 어떤 아이디어?

+0

apparrently jQuery는 독점 이벤트를 지원합니다. 따라서 $ dialogWidget.trigger ('click!')는 'click.namespace'이벤트가 아닌 'click'만 트리거합니다. 나는 이것의 반대가 필요하다. $ dialogWidget.bind ('click.namespace!')와 같은 것은 수동으로이 정규 이벤트를 실행하는 항목 만이 의미하는 것입니다. –

답변

2

가장 간단한 해결책은 이벤트의 이름을 바꾸고 취하지 않은 이름을 사용하는 것입니다.

$dialogWidget 
    .bind('myClick.btn1.otherWidget',doSomething) 
    .bind('myClick.btn2.otherWidget',doSomething2) 
    .bind('myClick.btn1.otherWidget2',doSomething3); 

을 그리고 당신이 그것을 실행할 때 :이 경우, 그냥이 대신 같은 것을 할, click를 사용하지 않는

이 있었다
$dialogWidget.trigger('myClick.btn1.otherWidget'); 

click 네임 스페이스의 사용자 정의 이벤트를 트리거하지 않습니다 당신 다른 방법으로 해고하고 싶지 않아요. 분명히 이것은 해킹이 아니며 완전히 정상적인 jQuery 동작이므로 jQuery 이벤트 모델에서 의도적으로 지원됩니다. Google for jQuery custom events에는 많은 리소스가 있습니다.

+0

다시 한번 감사드립니다. Nick, 나는이 작업을 수행하는 다른 방법이 있는지보고 싶었을 것으로 생각합니다. . 매우 감사 –

2

여기서 이벤트 위임을 사용하고 event.target 속성으로 수행 할 작업을 시도 할 수 있습니다.

var $widgets = jQuery('.widget'); 
$widgets.click(function(event){ 
    if($(event.target).attr("id") !== "dialogWidget"){ 
     alert("You won't see this alert if you click on #dialogWidet"); 
    } 
}); 

이 정보는 도움이됩니다.