现有功能未定义

时间:2015-03-28 20:49:56

标签: javascript jquery hammer.js

我正在使用hammer.js库:http://hammerjs.github.io/并使用其jQuery插件。很少有像'panright panleft press'这样的事件可以调用函数。我试图调用cardSwipe(..)函数,但是得到一个consol错误,说明cardSwipe是未定义的。我无法弄清楚造成这种情况的原因。

/* Initiate HammerJS on elements */
        initHammer : function()
        {   
            /* Create Hammer object for swipable game cards */
            Game.$gameCard = $('.game-card-mobile');
            Game.$gameCardTouch = Game.$gameCard.hammer();

            Game.$gameCardTouch.on("panleft panright press", cardSwipe(ev, $(this), data));     
        },

        cardSwipe : function(ev, element, data) {
            console.log(ev.type);
            console.log(element);
            console.log(data);
        }

编辑:添加Game.cardSwipe解决了这个问题,但现在我得到一个错误:ev是未定义的,其中ev是一个hammer.js事件,应该被识别(如果我将我的函数交换为函数(ev){ ..})

2 个答案:

答案 0 :(得分:2)

那是因为cardSwipe在该上下文中确实未定义,它是父对象的一部分,可以使用this.cardSwipe

进行访问
initHammer : function() {   
    Game.$gameCard = $('.game-card-mobile');
    Game.$gameCardTouch = Game.$gameCard.hammer();

    Game.$gameCardTouch.on("panleft panright press", this.cardSwipe(ev, $(this), data));     
},
cardSwipe : function(ev, element, data) {
    console.log(ev.type);
    console.log(element);
    console.log(data);
}

看起来你似乎正在立即调用它,而不是引用它,通常你会把它转换成这样的东西

Game.$gameCardTouch.on("events", this.cardSwipe);  

或者如果您需要参数,请使用匿名函数

initHammer : function() {   

    var self = this;

    Game.$gameCardTouch.on("panleft panright press", function() {
        self.cardSwipe(ev, $(self), data);
    });
},
cardSwipe : function(ev, element, data) {

} 

但是我不知道cardSwipe真正返回了什么,以及它应该如何工作?

答案 1 :(得分:2)

在您的代码中,cardSwipe函数是某个对象的属性。您必须使用该对象引用,如下所示:

obj.cardSwipe(...)

以便调用它 - 其中obj是包含该属性的对象。

我不知道代码的整个上下文,但似乎适当的引用可能是:

this.cardSwipe(...);

因为你是从同一个对象的方法调用它。


与其他一些语言不同,当前对象上的方法不会自动在范围内。您必须使用this引用当前对象来访问属性或在当前对象上调用方法。


此外,您似乎正在尝试设置事件处理程序。在这种情况下,您可能不希望立即调用cardSwipe(),而是传递函数引用,您需要将this的值保存到本地,以便您可以在回调中引用它:< / p>

initHammer : function() {   
    var self = this;
    Game.$gameCard = $('.game-card-mobile');
    Game.$gameCardTouch = Game.$gameCard.hammer();

    Game.$gameCardTouch.on("panleft panright press", function() {
        self.cardSwipe(ev, $(self), data));
    });
},
相关问题