2012-04-16 221 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

相關問題