我像这样创建一个锤子实例:
var el = document.getElementById("el");
var hammertime = Hammer(el);
然后我可以添加一个监听器:
hammertime.on("touch", function(e) {
console.log(e.gesture);
}
但是我无法删除此侦听器,因为以下内容无效:
hammertime.off("touch");
我做错了什么?如何摆脱锤子听众? hammer.js文档目前很差,所以它除了存在.on()
和.off()
方法之外什么都没解释。我不能使用jQuery版本,因为这是一个性能关键的应用程序。
JSFiddle展示这个:http://jsfiddle.net/LSrgh/1/
答案 0 :(得分:6)
好的,我明白了。它的来源很简单,它正在做:
on: function(t, e) {
for (var n = t.split(" "), i = 0; n.length > i; i++)
this.element.addEventListener(n[i], e, !1);
return this
},off: function(t, e) {
for (var n = t.split(" "), i = 0; n.length > i; i++)
this.element.removeEventListener(n[i], e, !1);
return this
}
此处需要注意的事项(除了错误的文档)e
它是on
事件中的回调函数,所以你正在做:
this.element.addEventListener("touch", function() {
//your function
}, !1);
但是,在删除中,您不会传递回调,因此您执行以下操作:
this.element.removeEventListener("touch", undefined, !1);
所以,浏览器不知道女巫功能你试图解除绑定,你可以解决这个问题,而不是使用匿名函数,就像我在:
答案 1 :(得分:1)
为了解除OFF的事件,您必须:
1)当调用ON
时,将相同的回调函数集作为参数传递给OFF2)使用用于设置ON事件的相同Hammer实例
实施例
var mc = new Hammer.Manager(element);
mc.add(new Hammer.Pan({ threshold: 0, pointers: 0 }));
mc.add(new Hammer.Tap());
var functionEvent = function(ev) {
ev.preventDefault();
// .. do something here
return false;
};
var eventString = 'panstart tap';
mc.on(eventString, functionEvent);
UNBIND EVENT:
mc.off(eventString, functionEvent);
答案 2 :(得分:0)
HammerJS 2.0现在支持解除对事件的所有处理程序的绑定:
function(events, handler) {
var handlers = this.handlers;
each(splitStr(events), function(event) {
if (!handler) {
delete handlers[event];
} else {
handlers[event].splice(inArray(handlers[event], handler), 1);
}
});
return this;
}
答案 3 :(得分:0)
这是CodePen example的Nico posted。我为“tap”事件创建了一个简单的包装器(虽然它可以很容易地适应其他任何事情),以跟踪每个Hammer Manager。我还创建了一个kill函数来轻松地停止收听:P
var TapListener = function(callbk, el, name) {
// Ensure that "new" keyword is Used
if( !(this instanceof TapListener) ) {
return new TapListener(callbk, el, name);
}
this.callback = callbk;
this.elem = el;
this.name = name;
this.manager = new Hammer( el );
this.manager.on("tap", function(ev) {
callbk(ev, name);
});
}; // TapListener
TapListener.prototype.kill = function () {
this.manager.off( "tap", this.callback );
};
所以你基本上会做这样的事情:
var myEl = document.getElementById("foo"),
myListener = new TapListener(function() { do stuff }, myEl, "fooName");
// And to Kill
myListener.kill();