2012-04-16 223 views
0

所以现在我使用hammer.js将一些触摸控件绑定到页面上的元素。通过向元素上的右侧滑动,它将添加禁用的类。如果任何项目具有禁用的类别,本质上,我只想为该类别禁用的元素“解除绑定”双击和swiperight事件。有谁知道这是否可能?stopPropagation()只有一个元素

$('.row').hammer({ 
    prevent_default: false, 
    drag_vertical: false 
}).bind('doubletap swiperight', function(e) { 
    var $this = $(this) 
    if (e.type == "doubletap") { 
     confirm("Do You Want To Edit Med?") 
    } 
    else if (e.type == "swiperight") { 
     $this.removeClass('yHighlight'); 
     $this.addClass('gHighlight disabled'); 
     $this.css('opacity','.5') 
    } 

});

+0

您的标题显示“stopPropagation”(停止冒泡事件),但您的问题描述了禁用元素本身的行为。你究竟想要什么? – 2012-04-16 22:07:47

回答

1

您可以简单地从您的事件处理程序中检查触发该事件的元素是否具有该类;如果是这样,那么不做任何事情就返回。

.bind('doubletap swiperight', function(e) { 
    var $this = $(this); 

    // ADDED CODE 
    if ($this.hasClass("disabled")) { 
     e.stopPropagation(); 
     return; 
    } 
    if (e.type == "doubletap") { 
     confirm("Do You Want To Edit Med?") 
    } 
    else if (e.type == "swiperight") { 
     $this.removeClass('yHighlight'); 
     $this.addClass('gHighlight disabled'); 
     $this.css('opacity','.5') 
    } 
}); 
+0

非常感谢!我不知道如何正确使用返回。我只使用了返回false。再次感谢! – Alex 2012-04-16 23:02:31

1
if ($this.hasClass('disabled')) return; 
1

我建议使用jQuery事件委托,这是建立到.on() method。使用.on()方法而不是.bind()。下面是一个例子,它假定行的父元素的ID为“rowparent”。

('.row').hammer({ 
    prevent_default: false, 
    drag_vertical: false 
}); 

$('#rowparent').on('doubletap swiperight', '.row:not(.disabled)', function(e) { 
    var $this = $(this) 
    if (e.type == "doubletap") { 
     confirm("Do You Want To Edit Med?") 
    } 
    else if (e.type == "swiperight") { 
     $this.removeClass('yHighlight'); 
     $this.addClass('gHighlight disabled'); 
     $this.css('opacity','.5') 
    } 
}); 

.on方法有一个可选的选择参数。当doubletap或swiperight事件冒泡到#rowparent时,jQuery将针对该选择器测试事件的目标元素。所以这会自动“解除”事件,因为它们会停止匹配该选择器!

如果你有很多行,我会把这个优先级称作其他答案,这个答案在处理程序中对照类名进行测试;只绑定一个事件处理函数会更有效率。但是,如果只有很少的行,则只需在方法体中检查.hasClass即可,因为:not()选择器有点重。

+1

为了完整起见,可能值得指出的是,如果您正在使用['.delegate()'](http://api.jquery.com/delegate/)函数可以实现相同的功能1.7之前的版本,因此没有'.on()'函数可用。 – 2012-04-16 22:17:47

+0

如果Hammer.js在您将绑定调用更改为“on”调用时不工作,会发生什么情况? – Alex 2012-04-16 22:57:15

+0

哇。看起来像hammer.js停止传播它启用的所有事件,所以他们将永远不会使用'.delegate'。这并不太酷。那么我会和其他人的建议一起去。 – zetlen 2012-04-16 23:10:09

相关问题