0

我正在使用基于 jQuery 的 JavaScript 库,它允许移动触摸设备的触摸手势toe.js

toe.js 允许我添加一个tap类似于点击事件的事件,因此我启用tap了所有当前和未来的.button元素:

$(document)
  .on('tap', '.button', function() {
    tapAction($(this));
  });

function tapAction($btn) {
  // do stuff
  // disable all event handlers
  $btn.off();
}

但是,我不知道如何删除此事件处理程序;off()不工作......当我使用 Chrome 的开发工具检查元素时,所有的触摸事件处理程序仍然存在于元素上。

事件监听器

我可以做到$(document).off(),这行得通,但这也删除了所有元素的事件,包括当前和未来,这不是我想要的:(

我查看了 toe.js 的源代码,但找不到解除绑定事件的方法。那么如何删除所有元素的事件侦听器,最好使用 jQuery?

4

3 回答 3

2

好吧,您总是可以一一关闭每个触摸事件

$(document).on('tap', '.button', function() {
    $(this).off('touchstart', this);
    $(this).off('touchend', this);
    .....
});
于 2013-04-08T17:07:03.217 回答
0

采用unbind()

描述:从元素中删除先前附加的事件处理程序。

http://api.jquery.com/unbind/

于 2013-04-08T17:02:02.850 回答
0

问题在于我如何定义.on()事件处理程序。当.on()用于动态元素时,您将选择器作为参数传递给.on(),您不能.off()使用项目的子集。原因是根元素上只安装了一个事件处理程序,在本例中为document. 因此,对于每个被选中的元素,jQuery 只能删除整个事件处理程序。

克服这个问题的方法是删除整个处理程序并附加一个新的处理程序,其中排除了动态元素的子集。所以...

// remove the entire 'tap' handler for all '.button' elements
$(document).off('tap', '.button');

// re-add the 'tap' handler for all '.button-subset' elements
// same elements as before but excluding a certain set
$(document).on('tap', '.button-subset', function() {
  tapAction($(this));
});

我不太喜欢这个解决方案,因为它看起来效率低下、不优雅。我所做的是disabled向按钮添加一个类并在事件处理程序中检查它......

$(document)
  .on('tap', '.button', function() {
    if ($(this).hasClass('disabled')) { return false; }
    tapAction($(this));
  });
于 2013-04-08T20:33:24.863 回答