2010-06-19 9 views
19

클래스에서 사용하는 이벤트 핸들러 내부에서 Javascript 클래스 멤버 변수에 액세스하는 적절한 방법에 관해 빠른 질문이 있습니다. 예를 들어 :자바 스크립트에서 이벤트 핸들러 내에서 클래스 멤버 변수에 액세스

function Map() { 
    this.x = 0; 
    this.y = 0; 

    $("body").mousemove(function(event) { 
     this.x = event.pageX;  // Is not able to access Map's member variable "x" 
     this.y = event.pageY;  // Is not able to access Map's member variable "y" 
    }); 
} 

오히려 "맵"클래스의 멤버 변수를 변경하지 않고, "this.x"경우에 핸들러가 이벤트를 트리거 요소의 "X"멤버 변수에 영향을하려고합니다. 이벤트 처리기 내에서 "Map"클래스의 멤버 변수에 액세스하는 적절한 방법은 무엇입니까?

어떤 도움이라도 대단히 감사하겠습니다. 저는이 머리에서 내 머리를 긁적 거리고 있습니다.

건배, 찰리

답변

36

이벤트 맥락에서 this 변경 (일반적으로 global로 점), 당신은 이벤트의 외부에 자신에 대한 참조를 저장해야하기 때문에 :

function Map() { 
    this.x = 0; 
    this.y = 0; 
    var _self = this; 
    $("body").mousemove(function(event) { 
     _self.x = event.pageX;  // Is now able to access Map's member variable "x" 
     _self.y = event.pageY;  // Is now able to access Map's member variable "y" 
    }); 
} 
+0

은'이벤트 핸들러에 this' 값 통상 핸들러가이 경우 '이 === document.body'에 바인딩 된 DOM 요소 가리킨다. – CMS

+0

빠른 응답을 보내 주셔서 감사합니다! 이것은 매력처럼 작동하며 매우 깨끗합니다. 감사! – candrews

10

솔루션을 그 매트는 그것을가는 아마 방법을 줬다.

그냥 당신이이 같은 이벤트 객체를 통해 데이터를 전달할 수 있다는 지적 거라고 생각 :

function Map() { 
    this.x = 0; 
    this.y = 0; 

// Pass object with data-------------v 
    $("body").bind('mousemove', {ths: this}, function(event) { 
      // access this via event.data 
     event.data.ths.x = event.pageX; 
     event.data.ths.y = event.pageY;  
    }); 
} 

이 단지 정보를 원하시면입니다. 실제로 실용적인 응용 프로그램이 아닙니다. 매트의 지역 변수에 대한 참조가 더 적합합니다.

+0

나는 당신이 그것을 할 수 있다는 것을 몰랐다 - 그것은 흥미 롭다. 당신 말이 맞아요, 여기 실제적인 응용 프로그램이 아니지만, 미래에는 유용 ​​할 수 있습니다. 팁 고마워! – candrews

+0

이것이 유일한 방법이었던 상황에서 나는 나 자신을 발견했다 - 감사합니다! – alearg

0

JQuery.proxy을 사용하여 컨텍스트가있는 프록시 함수를 만들 수도 있습니다. 프록시를 이벤트에 바인드 할 수 없습니다. 여기

은 예이다 :

var init_handler = $.proxy(this.init, this); 
$('#page_id').bind('pageinit', init_handler); 
관련 문제