2012-04-16 9 views
0

今、私はhammer.jsを使っていくつかのタッチコントロールをページの要素にバインドしています。要素の右にスワイプすると、無効なクラスが追加されます。あるクラスに無効なクラスがある場合、そのクラスを無効にしている要素に対してのみダブルタップとswiperightイベントを "バインド解除"する必要があります。これが可能なら誰でも知っていますか?1つの要素だけの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"(イベントのバブリングを止める)と述べていますが、あなたの質問は要素自体の動作を無効にすることについて説明しています。どちらを実際にしたいですか? –

答えて

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

ありがとうございました!私はリターンを正しく使う方法を知らなかった。私は虚偽を返すだけを使用しています。再度、感謝します! – Alex

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

私は.on() methodに構築され、jQueryのイベントの委任を使用してお勧めしたいです。 .bind()の代わりに.on()メソッドを使用します。ここでは、行の親要素の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はそのセレクタに対してイベントのターゲット要素をテストします。したがって、セレクタとのマッチングを停止するので、イベントを自動的に「アンバインド」します。

多くの行がある場合は、ハンドラー内のクラス名に対してテストするその他の答えを上位と呼びます。単一のイベントハンドラをバインドする方が効率的です。しかし、ほんのわずかの行しか持っていない場合は、:not()セレクタが少し重いので、メソッド本体の.hasClassでチェックするほうが効率的かもしれません。

+1

完全性のために、もしあなたが使用しているならば、同じ機能が['.delegate()'](http://api.jquery.com/delegate/)関数を使って達成できることを指摘しておきましょう1.7より前のバージョンであり、 '.on()'関数が利用できません。 –

+0

バインドコールを「オン」コールに変更したときにHammer.jsがもう動作しない場合はどうなりますか? – Alex

+0

Whoa。 hammer.jsが可能にするすべてのイベントで伝播を停止するように見えるので、 '.delegate'では動作しません。それはあまりにも冷たくないです。私は他の人の推薦と一緒に行くだろう。 – zetlen

関連する問題