0

Javascript のクラス内に画像をロードするとき、コールバックをグローバル メソッドではなくクラスのメソッドにする方法を教えてください。

tc = new TestClass();

var TestClass = function(){


    var img = new Image();
    img.src = 'mars.png';
    img.onLoad = this.imagesHasLoaded(); //does not work, 
            //uncaught TypeError: Object [object Object] has no method 'imagesHasLoaded' ....js:28

            img.onLoad = imageLoaded(); //Works, logs yes, its loaded


    function imageLoaded(){

        console.log("yes, its loaded");
    }

    this.imagesHasLoaded = function(){

        console.log("loaded happened");
    }

    function isLoaded(){

        trace("loaded happened");
    }


}
4

2 に答える 2

0

を呼び出した時点this.imagesHasLoaded();では、関数はまだ存在していません。

最初にすべての関数を定義してから、初期化部分を呼び出すことをお勧めします。最後に、パブリック関数を保持するオブジェクトを返すことができます:

var TestClass = function (path) {
    var priv, publ;

    /*
     * PRIVATE
     */
    priv = {
        img: null,

        imageLoaded: function () {
            console.log("yes, its loaded");
        }
    };

    /*
     * PUBLIC
     */
    publ = {
        isLoaded: function () {
            trace("loaded happened");
        }
    };

    priv.img = new Image();
    priv.img.src = path;
    priv.img.onload = priv.imageLoaded;


    return publ;
};

var tc = TestClass('mars.png');

PS: imageLoaded()(コード内で) 変数として定義されていないため、呼び出される可能性があります。さらにimg.onload、単に関数に設定したのではなく、関数の結果を設定しました: 関数をコールバックとして使用する場合は、括弧の使用に注意してください ;) !

于 2012-08-03T23:07:36.220 に答える
0

表示されている問題は、エラーのある行に到達したときに、まだ this.imagesHasLoaded を定義していないことです。

Javascript は順次実行され、関数を作成するために先読みしません。

コードを次のように変更すると、機能します。

tc = new TestClass();

var TestClass = function(){
    var img = new Image();
    img.src = 'mars.png';

    this.imagesHasLoaded = function(){

        console.log("loaded happened");
    }

    function isLoaded(){

        trace("loaded happened");
    }

    img.onLoad = this.imagesHasLoaded;
}

の後の括弧を削除したことにも注意してくださいthis.imagesHasLoaded。これは、括弧を使用すると、すぐに this.imagesHasLoaded を呼び出し、その呼び出しの結果をイベント ハンドラーとして割り当てるためです。かっこを削除すると、関数がイベント ハンドラーとして割り当てられ、画像の読み込みが完了したときにのみ呼び出されます。

于 2012-08-03T23:08:29.753 に答える