2

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

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

4 回答 4

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

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

小提琴

有关更多信息:Javascript removeEventListener 不起作用

于 2013-06-28T14:58:12.240 回答
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);

解除绑定事件:

mc.off(eventString, functionEvent);
于 2015-06-08T10:28:53.737 回答
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;
}
于 2015-03-05T10:12:48.363 回答
0

这是Nico 发布的CodePen 示例。我为“点击”事件创建了一个简单的包装器(尽管它可以很容易地适应其他任何东西),以跟踪每个 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();
于 2015-04-21T02:11:42.703 回答