2

我做了一个javascript原型类。

在一个方法中,我创建了一个 jquery 点击。但是在这个点击中,我想执行我的构建功能。

当我尝试在 jquery 中执行原型函数时,单击它会失败,因为 jquery 将其用于其他用途。

我尝试了一些不同的东西,但我无法让它工作。

Game.prototype.clicks = function(){
    $('.flip').click(function(){

        if(cardsPlayed.length < 2) //minder dan 2 kaarten gespeeld
        {
            $(this).find('.card').addClass('flipped');
            cardsPlayed.push($(this).find('.card').attr('arrayKey'));

            console.log(cardsPlayed[cardsPlayed.length - 1]);

            console.log(playingCards[cardsPlayed[cardsPlayed.length - 1]][0]);

            if(cardsPlayed.length == 2)// two cards played
            {
                if(playingCards[cardsPlayed[0]][0] == playingCards[cardsPlayed[1]][0])
                { // same cards played
                    console.log('zelfde kaarten');
                    playingCards[cardsPlayed[0]][0] = 0; //hide card one
                    playingCards[cardsPlayed[1]][0] = 0; //hide card two
                    //rebuild the playfield
                    this.build(); //error here
                }
                else
                {
                    //differend cards
                }

            }
        }

        return false;
    }).bind(this);
}
4

3 回答 3

3

问题是您试图引用this单击的.flip元素$(this).find('.card') 以及Game. 不能有双重人格,所以其中一个参考需要改变。this.build()this

Game正如 Licson 已经建议的那样,最简单的解决方案是在处理程序的范围内保留一个指向对象的变量click。然后,只需this在处理程序内部使用被点击的元素(就像在 jQuery 处理程序中一样)并self用于Game对象。

Game.prototype.clicks = function() {
    // Keep a reference to the Game in the scope
    var self = this;

    $('.flip').click(function() {
        if(cardsPlayed.length < 2) //minder dan 2 kaarten gespeeld
        {
            // Use this to refer to the clicked element
            $(this).find('.card').addClass('flipped');
            // Stuff goes here...
            // Use self to refer to the Game object
            self.build();
        }
    }); // Note: no bind, we let jQuery bind this to the clicked element
};
于 2013-01-26T11:10:59.490 回答
1

我想你想要这样的东西:

function class(){
    var self = this;
    this.build = function(){};
    $('#element').click(function(){
        self.build();
    });
};
于 2013-01-26T09:40:53.727 回答
-1

如果我理解正确,在现代浏览器中,您可以简单地使用bind

function MyClass() {
  this.foo = 'foo';
  $('selector').each(function() {
    alert(this.foo); //=> 'foo'
  }.bind(this));
}

否则,只需缓存this在一个变量中,通常self并在必要时使用它。

于 2013-01-26T09:30:23.753 回答