2013-05-17 1 views
0

JavaScript에서 이벤트 처리를 사용하려고합니다. 이것이 내가 지금까지 가지고있는 것입니다 :프로토 타입 상속을 사용하여 자바 스크립트에서 이벤트 처리

그러나 어떤 이유로 든 모든 이벤트가 동시에 트리거됩니다. 예를 들어, Click 이벤트 트리거링 대신 Form의 Title 필드를 클릭하면 네 개의 이벤트가 모두 트리거됩니다.

내가 뭘 잘못하고 있니?

+0

'this.elem.addEventListener ('...', this, false);'이벤트 리스너로 오브젝트 인'Field' 인스턴스를 첨부합니까 - 함수 여야합니까? – Bergi

답변

2

귀하의 switch 문이 일부 break 문을 누락하므로, click의 경우 4 가지 방법이 모두 실행됩니다.

Field.prototype.handleEvent = function(event) { 
    var prop = event.type; 
    if (prop in this) // && typeof this[prop] == "function" 
     this[prop](this.value); 
}; 

명시 적으로 언급하지 않고 모든 이벤트에 대해 작동합니다

그러나, switch -statement보다 더 나은 옵션이있다.

+0

네, 매력처럼 작동했습니다. 그런데 왜 'onblur'이벤트가 발생하지 않는지 아시겠습니까? – user

+0

@user : 이벤트의 이름이'blur'이기 때문에 :-)'on' 접두사는 M $'.attachEvent'와 event-properties에만 해당합니다. – Bergi

+0

감사합니다. Derija93은 똑같은 제안과 흐림 효과를 제안했습니다. 그러나 처음에는 필드에 집중할 때를 포함하여 여러 번 트리거되는 것처럼 보입니다. 또한 창을 전환 할 때 트리거됩니다. 내가 어떻게 고칠 수 있는지 아십니까? 그건 그렇고, 이벤트 핸들링에 대한이 접근 방식이 좋은가요? 너는 전문가이기 때문에 내가 물어볼 줄 알았다. :) – user

3

심플. case 블록이 끝날 때마다 break; 문을 사용하여 모든 블록과 구분하십시오.

+0

귀하의 대답은 정확합니다. 내가 뭘 생각하는지 모르겠다! 그러나 Bergi 's는 switch 문보다 더 우아 해 보입니다. 그래서 저는 그것을 대답으로 선택했습니다. 그건 그렇고, 왜 'onblur'이벤트가 발생하지 않을지 아시나요? – user

+0

@user 아마도 리스너를 사용하여 등록 할 때 'on'을 생략하기 때문일 수 있습니다. 그래서'addEventListener ('blur', ...); 만 시도해보십시오. – Kiruse

+0

그래야 흐림 효과가 있습니다. 그러나 마지막 질문. 그것 (흐림)은 내가 필드에 처음으로 집중했을 때를 포함하여 여러 번 트리거되는 것처럼 보입니다. 또한 창을 전환 할 때 트리거됩니다. 그 해결책을 알고 있습니까? – user

1

switch 문에 각 경우마다 break이 있어야합니다.

switch (event.type) { 
    case "click": this.click(this.value); break; 
    case "onblur": this.onblur(this.value); break; 
    case "change": this.change(this.value); break; 
    case "dblclick": this.dblclick(this.value); break; 
} 

마지막 휴식은 필요하지 않지만 추가 사례를 추가 할 수 있으므로 포함하는 것이 좋습니다.

+0

Bergi의 해결책은 매우 정교합니다. 감사! – user

관련 문제