Hammer.js无法删除事件监听器

时间:2013-06-28 14:33:46

标签: javascript hammer.js

我像这样创建一个锤子实例:

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/

4 个答案:

答案 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);

所以,浏览器不知道女巫功能你试图解除绑定,你可以解决这个问题,而不是使用匿名函数,就像我在:

Fiddle

了解更多信息:Javascript removeEventListener not working

答案 1 :(得分:1)

为了解除OFF的事件,您必须:

1)当调用ON

时,将相同的回调函数集作为参数传递给OFF

2)使用用于设置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 exampleNico 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();