2009-10-04 5 views
3

jQuery 플러그인에서 이벤트를 디스패치하여 해당 이벤트에 대해 여러 청취자를 가질 수있는 방법을 찾고 있습니다. 필자는 공개 설정을 통해 나중에 리스너를 추가 할 수 있도록 자체에 대한 참조를 반환합니다.여러 청취자를위한 플러그인에서 jQuery 디스패치 이벤트

지금까지 하나의 이벤트 핸들러, 예를 들면가 본 적이있는 유일한 예 :

$.fn.foo = function(options) { 
    ... 
    // trigger event 
    options.eventHandler(); 
} 

$('#bar').foo({ eventHandler: myEventHandler }) 

내가 할 무슨 일이 있었는지 내 유일한 옵션은, 간단하게 등록 된 이벤트 핸들러의 배열을 가지고 있고 각각의 호출 그 (것)들의, 또는 나는 더 나은 대안을 놓치고있다.

+0

호기심 : 왜 한 이벤트에 여러 개의 수신기를 추가하려고합니까? – roosteronacid

+0

이벤트가 발생할 때 여러 가지 일이 발생하기 때문에 이벤트 기반 프로그래밍의 핵심 이점 중 하나입니다. 예를 들어, 클릭 이벤트에 원하는 수만큼의 리스너를 추가 할 수 있으며, 모두 해당 이벤트를 기반으로 자체적 인 작업을 수행합니다. – DEfusion

+0

의미가 있습니다. 나는 대답을 추가했다. 그냥 루프를 닫습니다. – roosteronacid

답변

2

나는 생성자/옵션 개체에 배열을 던지면서 갈 것입니다. 이것은이 일반적으로 어떻게하는지입니다 :

$("").plugIn(
{ 
    prop: "value", 
    foo: "bar", 
    eventsToFire: [ 
     function() { }, 
     function() { }, 
     function() { } 
    ] 
}); 

그리고 플러그인이의 라인을 따라 뭔가 할 것 :

당신이 컬렉션 실행하도록되어 플러그인을 작성하는 가정을.

jQuery.fn.plugIn = function (options) 
{ 
    return this.each(function() 
    { 
     var i = options.eventsToFire.length; 

     while (i--) options.eventsToFire[i](); 
    }); 
}; 
+1

while 문을 줄이면 while 문을 단축 할 수 있습니다. 'while (i--;) {}' –

+0

맞습니다. 꽤 근사한 :) – roosteronacid

+0

그래, 내가 생각했던 것 꽤 많이 그래. 유일한 차이점은 나중에 이벤트 핸들러를 추가 할 수 있도록 플러그인에 registerEventHandler 메소드가 있다는 것입니다. – DEfusion

0

왜 배열을 사용하지 않고 루프합니까? 아래 코드는 배열과 단일 이벤트 처리기를 모두 허용합니다.

$.fn.foo = function(options) { 
    ... 
    // trigger event 
    if(typeof eventHandler == "Array"){ 
     for(var i=0; i<eventHandler.length; i++){ 
     options.eventHandler[i](); 
     } 
    }else{ 
     options.eventHandler(); 
    } 
} 

$('#bar').foo({ eventHandler: [myEventHandler, anotherEventHandler] }) 
+0

그래, 내가 생각했던 것이다. (비록 registerEventHandler 메소드가 있기 때문에 나중에 핸들러를 등록 할 수있다.)하지만 더 나은 (표준/코어에서 jQuery로) 대안이 있는지 궁금하다. – DEfusion

관련 문제