我正在使用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){ ..})
答案 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));
});
},