0

クラスを使用してマウス リスナーを作成する際に問題が発生しています。最初にクラス (new mouseEventManager()) を作成し、次に、zoomHandler 関数を設定する init() 関数を呼び出します。画面を適切にスケーリングするには、クラスの変数 scale_level を使用する必要があります。ただし、scale_level は NaN (数値ではない) であると言われています。

コードは次のとおりです。

function mouseEventManager() {

this.designManager;
this.canvasManager;
this.scale_level; 

this.init = function(designManager, canvasManager) {

this.designManager = designManager;
this.canvasManager = canvasManager; 
this.scale_level = 1; alert(this.scale_level);

var designManager = this.designManager;

//general mousemove listener
$(document).mousemove(function(e){
    designManager.HAND_X = e.pageX;
    designManager.HAND_Y = e.pageY;
}); 


//create scroll wheel listener
if(window.addEventListener) { document.addEventListener('DOMMouseScroll', this.zoomHandler, false); } 
document.onmousewheel = this.zoomHandler;

}


this.zoomHandler = function() {

var delta = 0;

if (!event) event = window.event;
// normalize the delta
if (event.wheelDelta) {
        // IE and Opera
        delta = event.wheelDelta / 60;
} else if (event.detail) {
        // W3C
        delta = -event.detail / 2;
}

if (delta > 0) {
    //scroll wheel up
    this.scale_level = this.scale_level * 1.25; alert(this.scale_level);
    this.canvasManager.mainLayer.setScale(this.scale_level);
    this.canvasManager.mainLayer.draw();
} else if (delta < 0) {
    //scroll wheel down
    this.scale_level = this.scale_level * 0.8;
    this.canvasManager.mainLayer.setScale(this.scale_level);
    this.canvasManager.mainLayer.draw();
}

alert(delta);

}


}

zoomHandler 内のように見えますが、mouseEventManager の内部メンバーは定義されていません。したがって、変数のスコープまたは関連する何かで何か間違っていると思います。

助けてくれてありがとう。

4

1 に答える 1

2

問題はthis、ハンドラーが実際に呼び出されたときに、ハンドラーが必要なものにならないことです。

次のように変更してみてください。

var manager = this;
this.zoomHandler = function() {
   // ...

次にthis、関数で使用する場所では、代わりmanagerに、オブジェクトへの「保存された」参照を使用します。

if (delta > 0) {
    //scroll wheel up
    manager.scale_level = this.scale_level * 1.25; alert(manager.scale_level);
    manager.canvasManager.mainLayer.setScale(manager.scale_level);
    manager.canvasManager.mainLayer.draw();
} else if (delta < 0) {
    //scroll wheel down
    manager.scale_level = manager.scale_level * 0.8;
    manager.canvasManager.mainLayer.setScale(manager.scale_level);
    manager.canvasManager.mainLayer.draw();
}
于 2012-06-20T04:05:19.913 に答える