2013-06-28 199 views
2

我創建像這樣錘子實例: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/

+0

我認爲應該工作...出於好奇,你嘗試過重新創建實例?像'Hammer(el).off(「touch」)' – NicoSantangelo

+0

@NicoSantangelo是的,它什麼都不做。聽衆仍然在那裏。 –

+0

@NicoSantangelo也添加了一個小提琴,它可以顯示行爲,並且可以很容易地測試出來。 –

回答

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

因此,瀏覽器不知道巫功能是你想UNB IND,就可以解決這個問題不能使用匿名函數,像我一樣的:

Fiddle

欲瞭解更多信息:Javascript removeEventListener not working

+0

謝謝,我想這是有道理的,我忘記了'removeEventListener()'沒有它失敗。這將是很好,如果hammer.js會添加一些巫術,以允許這樣的存儲引用數組中的匿名函數或其他東西。我會建議他們。 –

+0

是的,他們可能可以解決這個問題,讓用戶看不到它,但至少在文檔中提到一個很好 – NicoSantangelo

+1

重要提示:關閉OFF時,您必須使用您用來設置/啓用事件的Hammer實例。打電話。 – engine9pw

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; 
} 
0

這是Nico postedCodePen example。我爲「tap」事件創建了一個簡單的包裝(儘管它可以很容易地適用於其他任何事情),以便跟蹤每個Hammer Manager。我還創建了一個殺功能無痛停止收聽: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(); 
1

爲了解除用OFF,則必須將事件:

1)時呼籲

2作爲傳遞參數OFF相同的回調函數集)使用使用相同的錘實例來設置上的事件

例:

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

如果在代碼的其他部分發生「關閉」,您是否希望存儲對Hammer實例的引用(即'mc')? – Medorator