2011-08-06 7 views
0

여기 내 코드 구조가 있습니다. 다른 사람에게서 본 것으로 이해하려고합니다. 나는 그것의 클로저 스타일을 믿고 플러그인 스타일이 아닌가? 어쩌면 누군가가 폐쇄 스타일이라면 나를 위해 이것을 분명히 할 수있을 것입니다.jquery에서 이벤트 트리거

종류의 플러그인 스타일. 다음은 몇 가지 일반적인 질문입니다.

  1. 변수 NP가 전역 이름 공간에 올바르게 있습니까? 클로저와 내부 공개 메서드에 대한 참조로 을 사용했습니다.
  2. 메서드를 사용하기 전에 NP (네임 스페이스 임)를 사용하면 클로저 외부에서 해당 메서드를 참조 할 수 있습니다.
  3. NP를 null로 설정하면 가비지 콜렉션이 파괴되어 모든 변수를 포함하여 NP 내부의 모든 것의 이 허용됩니다.

여기는 더 큰 질문이므로 직접 설명하겠습니다. 내부 메소드에서 이벤트를 트리거 할 때 actionMethod() 다른 js 파일에서부터 해당 이벤트를받을 수 있기를 원합니다. 예를 들어 home.js

home.js

$(function(){ 

     NP.bind("CHANGED", event_handler); 

    function event_handler(evt, data){ 
     // do something.... 
    } 

    $('#button').click(function(){ 
     // call my public method in my NP plugin 
     NP.PublicMethod(); 
    }); 

    }); 

폐쇄 (스타일)

var NP = function(namespace){ 

    var innerVariable = "the outside scope can't here me"; 

    finction innerMethod(){ 
     //does some inner functionality to the closure 
    } 

    namespace.PublicMethod = function(){ 
     // does some calling of inner function. 
     // user can access this method from the myplugin directly. 
     // example: NP.PublicMethod(); 
    } 

    function actionMethod(){ 
     // trigger an event so others outside this closure can react 
     namespace.trigger("CHANGED"); 
    } 

    }(NP || {}); 

누군가는 트리거에 대한 더 큰 질문을 처음 3 질문에 대답 할 수하십시오 이벤트. 미리 감사드립니다

업데이트 : ShankarSangoli는 DOM 요소에서 이벤트를 트리거로의 예를 만든

뭔가. 여기에있는 문제는 내 가까이에있는 닫기 단추 역할을하는 dom 요소가 있지만 home.js에 대한 참조 또는 참조가 없기 때문입니다. 따라서 NP 객체 수준에서 청취 할 수있는 방법이 필요합니다. 테스트로서 나는 아래의 코드를 시도해 보았다. 이유는 모르겠지만 DOM 요소가 아닌 대부분의 언어에서 가장 일반적인 객체에서 이벤트를 실행할 수 있습니다. 그리고이 경우 NP는 실제로 객체이거나 객체를 생각하는 데 미친 것입니다.

폐쇄 개체

function actionMethod(){ 
      // trigger an event so others outside this closure can react 
      $(namespace).trigger("CHANGED"); 
     } 

home.js

$(TWCCP).bind("CLOSED_POPUP", onClosePopup); 

지금 나는 이것에 대해 매우 혼란 스러워요. 이게 지금 어떻게 가능합니까 ???

답변

1
  1. 예, NP은 글로벌 네임 스페이스입니다.
  2. 예, NP의 방법을 사용하기 위해 당신은 다음 NP = null을 설정하면 NP.methodName();
  3. 가 파괴 될 것이라고해야하고 자바 스크립트는 가비지 컬렉션 알아서하고 그것을 내부 변수를 파괴하는 것입니다.

NP이 dom 요소와 연결된 jquery 객체가 아니면 NP.bind을 사용할 수 없습니다. 질문의 마지막 부분 (스타일)

var NP = function(namespace){ 

    var innerVariable = "the outside scope can't here me"; 

    finction innerMethod(){ 
     //does some inner functionality to the closure 
    } 

    namespace.PublicMethod = function(){ 
     // does some calling of inner function. 
     // user can access this method from the myplugin directly. 
     // example: NP.PublicMethod(); 
    } 

    function actionMethod(){ 
     // trigger an event so others outside this closure can react 
     $(namespace).trigger("CHANGED"); 
    } 

    namespace.bind = function(eventType, handler) 
    { 
     $(namespace).bind(eventType, handler); 
    } 
return namespace; 

    }(NP || {}); 

home.js을이

폐쇄를 시도 할 경우

어떤 이벤트를 트리거하는 방법은

$("domElementSelector").trigger("click");//Or any otherr event, even custom event like in your case CHANGED can be triggered. 

다음과 같다

$(function(){ 

     NP.bind("CHANGED", event_handler); 

    function event_handler(evt, data){ 
     // do something.... 
    } 

    $('#button').click(function(){ 
     // call my public method in my NP plugin 
     NP.PublicMethod(); 
    }); 

    }); 
+0

감사합니다 ShankarSangoli 그래서 NP 개체 자체에서 해고 된 모든 이벤트를들을 수 있습니다. 닫기 버튼이 NP 객체 클로저에있을 것이고, 나는 그것이 일어 났을 때 CHANGED 이벤트를 발생시킬 수 있기를 원합니다. 그런 다음 내 집에서. js이 이벤트를 수신하고 내 event_handler() 메소드로 작업 할 수 있기를 원합니다. 제 생각에는 이벤트는 객체 자체가 아니라 DOM 요소에서만 해고 될 수 있습니까? – Chapsterj

+0

@Chapsterj - 내 수정 된 답변을 확인하십시오. – ShankarSangoli

+0

편집 된 답변도 확인하십시오. bindToChangedEvent가 로컬이므로 위의 코드가 작동하지 않습니다. namespace.bindToChangedEvent = function()을 사용하여 호출해야합니다. 또한 이것은 제가 요구하는 것이 아닙니다. 나는 해고 된 사건을 경청하고 돔 요소를 반대하는 방법이 필요하다. home.js는 이벤트를 발생시키는 돔 요소에 대해 전혀 모릅니다. – Chapsterj