2012-01-21 3 views
3

자바에서는 소유하지 않은 객체를 수정해서는 안된다는 것이 일반적인 이해입니다. 나는 그 논쟁을 이해하고 동의한다. 그럼에도 불구하고 Event 객체의 몇 가지 속성을 추가하려고합니다. 먼저 작은 배경과 의미가 무엇인지 그리고 내가 프로와 사기가있는 지적인 피드백을 얻기를 희망합니다.자바에서 이벤트 객체 수정

addEvent, removeEvent 등과 같은 메소드가있는 이벤트 관리자를 작성했습니다. 이벤트가 발생하면 처리기를 호출하여 eventlisteners가 등록 될 때 전달 된 이벤트 핸들러에 이벤트 객체를 전달합니다. .

이벤트 객체를 전달하기 전에 몇 가지 속성을 이벤트 객체에 추가합니다. 예를 들면; "hot-key"- "shift-c", "alt-d"또는 "meta-a"와 같은 가능한 값 사용. (마지막 하나는 Window의 "ctrl-a"와 MacOS의 "cmd + a"에 해당합니다. 즉, OS에 따라 올바르게 일치 할 것이고 핸들러의 논리적 패턴은 켜져 있는지 여부를 신경 쓸 필요가 없습니다 어떤 OS 또는 어떤 메타 키인지)

의미있는 것은 모든 필요한 "if-then"문이 이벤트 관리자에 의해 실행 되었기 때문에 처리기 코드가 작아지는 것입니다. 키 관련 이벤트가 발생했습니다. 이벤트 핸들러는 switch 문을 가지고 재미있는 일을 할 필요가 거의 없다.

hotKey-properties 외에 다른 속성도 추가 할 예정입니다. 주로 이벤트 처리기 기능을 단순화하여 이벤트 처리기에서 일반적으로 실행되는 논리를 제거합니다. colissions의 이름 지정을 피하기 위해 하위 속성에 새 속성을 추가 할 수 있습니다. 즉, 속성이 최상위 속성 일 필요는 없습니다.

저는 이것을 현재 구현 중이지만 통찰력을 얻고 싶지는 않을 것 같습니다.

ADDITION

문제는 다른 사람들이 아래의 구현의 생각이다. 이를 위해서는 핸들러에 전달 된 이벤트 오브젝트를 수정해야합니다. 나는 내가 소유하지 않은 객체를 실제로 수정하고 있기 때문에 질문을하고 있는데,이 경우에는 그렇게하는 것이 유리합니다.

addEvent(document, "keyup", function(event) { 
    switch (event.hotKey) { 
     case 'meta-c': 
      // code here 
      break; 
     case 'meta-a': 
      // code here 
      break; 
    } 
}); 
+1

이벤트 개체를 수정해도 괜찮습니까?이 질문은 [codereview] (http://codereview.stackexchange.com/)에 속한 것 같습니다. – Esailija

답변

0

솔루션의 draback는 event.hotKey의 구현에 사용자를 연결한다는 것입니다. 만약 다른 라이브러리가 자신의 구현 인 event.hotKey을 추가했다면, 그것들을 사용하려고하는 사용자는 디버깅 문제를 해결하기가 어려울 것입니다.

대신 이벤트 객체 자체를 변경, 당신은 별도로 기능을 제공한다 : 당신이 핸들러가 이벤트를 마무리해야한다는 사실을 마음에 들지 않으면

function MyEvent(event) { 
    var myEvent = clone(event); 
    myEvent.hotKey = ... 
    return myEvent; 
} 

addEvent(document, "keyup", function(event) { 
    switch (MyEvent(event).hotKey) { 
     case 'meta-c': 
      // code here 
      break; 
     case 'meta-a': 
      // code here 
      break; 
    } 
}); 

, 당신은 청취 기능을 변경할 수 있습니다 :

function myAddEvent (target, type, handler, capture, scope) { 
    var myHandler = function(event){ 
    handler.call(scope,MyEvent(event)); 
    } 
    addEvent(target, type, myHandler, capture); 
} 

*이, 당신은 여전히 ​​unlistening과 다른 측면

0

안녕 하칸을 여기에 또한 고려하는 것이 단지 초안 솔루션을 필요로한다 :

event object을 직접 만든 다음 trigger() 기능을 사용하여 보내보십시오.

//Create a new jQuery.Event object without the "new" operator. 
 
var e = jQuery.Event("click"); 
 
    
 
// trigger an artificial click event 
 
jQuery("body").trigger(e);

트리거

$("#foo").on("click", function() { 
 
    alert($(this).text()); 
 
}); 
 
$("#foo").trigger("click");

모든 예는 이러한 링크에있다.

+0

링크 부패 나 변경된 콘텐츠로부터 응답을 보호하려면 귀하의 답변에 링크 된 콘텐츠의 관련 부분을 포함하십시오. –

+0

Ok Michael L 나는 그것을 할 것입니다, 감사합니다. –