2011-06-25 17 views
0

ここで私はうまくいきません - mouseMove this.mouseXは未定義です。 mousemoveイベントからmouseXとmouseY(コード内のe.pageX)が必要です。javascript変数スコープの関数間での関連性jQuery関与

function myClass() { 
    var mouseX=x; 
    var mouseY=y; 
    $(document).mousemove(this.mouseMove); 
} 
myClass.prototype.mouseMove = function(e){ 
    this.mouseX=e.pageX;//not a good idea but you can alert this 
} 
var a=new myClass(); 

想定されるクラスインスタンスにそのイベントが渡されることはありますか、それを行う方法はありませんか?

ここでもグローバルスコープ変数を避けようとしています。

答えて

1

三つのこと:

var mouseXのみMyClassの機能にローカル変数を宣言します。第二に

function myClass() { 
    this.mouseX=x; // where do x and y come from? 
    this.mouseY=y; 
    //... 
} 

、あなたはコンストラクタにパラメータとしてxyを渡すことを確認してください:あなたは(this現在のインスタンスを参照)this.mouseXとインスタンスのプロパティを宣言しなければなりません。それ以外の場合は、エラーが発生します(高いスコープで定義されていないものの、それは私には役に立たないようです)。あなただけのイベントハンドラとしてthis.mouseMoveを渡す場合

第三に、イベントハンドラ内で、thiswindowにではなくmyClassインスタンスを参照します。明示的にコールバックのコンテキストを設定する$.proxyを使用します。

function myClass(x, y) { 
    this.mouseX=x; 
    this.mouseY=y; 
    $(document).mousemove($.proxy(this.mouseMove, this)); 
} 

私はMDC - Working with objectsを読むことをお勧めします。

+0

最初の2つの事柄は、私のコピーペースト消去のサンプル作成プロセスの間違いであり、第3のものは私が探していたものです。 – Martin

0

this.mouseMoveのようなメソッドをコールバック関数として渡すと、もはやインスタンスに結びついていないので、thisがグローバルオブジェクトになります。スコープを修正するには、そのように、閉鎖中のインスタンスを渡すことができます。

function myClass (x,y) { 
    var mouseX=x; 
    var mouseY=y; 
    var that = this; 
    $(document).mousemove(function() { that.mouseMove() }); 
} 
0

試してみてください。

function myClass (x,y) { 
    var mouseX=x; 
    var mouseY=y; 
    var $this = this; 

    $(document).mousemove(function(){$this.mouseMove()}); 
} 
myClass.prototype.mouseMove = function(e){ 
    this.mouseX=e.pageX;//not a good idea but you can alert this 
} 
var a=new myClass(); 
0
function myClass() { 
    this.mouseX=x; 
    this.mouseY=y; 
    $(document).mousemove(this.mouseMove); 
} 
myClass.prototype.mouseMove = function(e){ 
    this.mouseX=e.pageX;//not a good idea but you can alert this 
} 
var a=new myClass(); 

はあなたにはインスタンス化し、このキーワードではなくVARを使用する必要がありますコンストラクタ

関連する問題