2012-06-13 48 views
9

と私はhammer.jsを使用していますし、私がevent.stopPropagation()タップイベントでは動作しないことが表示されます。のstopPropagation()をタップイベント

私は子供をクリックすると、関連するイベントがトリガされますが、親のイベントもトリガされ、私はそれを望んでいません。ここで

$('#parent').hammer().bind('tap', function(e) { 
    $(this).css('background', 'red'); 
});​​​​​​​​ 

$('#child').hammer().bind('tap', function(e) { 
    e.stopPropagation(); 
    $(this).css('background', 'blue'); 
}); 

は一例です:http://jsfiddle.net/Mt9gV/

私もjGesturesを試み、問題が同じであるように思われます。 これらのライブラリのいずれかでこの結果を得るにはどうすればよいですか?

+0

親要素と子要素の両方に「ハンマー」の要素を設定しているということが関係していると思います。しかし私は100%確かではない。 – Pointy

+0

残念ながら、両方の要素にハンマーを適用しないと、タップ・イベントは機能しません。 – TimPetricola

答えて

8

別のコメントで述べたように、あなたが行ったように、1は、期待されますイベントが親にバブリングするのを止める必要があります。

詳細:ただし、Hammer.js ではこれはそうではありません。ハンマーは、$(el).hammer()と呼ぶ各要素の新しいジェスチャーステートマシンを作成します。したがって、タッチイベントがブラウザによって子に発せられると、それは最初に子のロジックによって処理され、親のロジックによって再び処理されます。 タップイベントを取得してから親を停止するなど、あなたはオリジナルのタッチイベントを得ることから、親のハンマー・ステート・マシンを防ぐ必要があります。一般に、event.stopPropagation()を呼び出すと元のイベントの伝播も停止します。ただし、hammer.jsのtapイベントはtouchendで発生しますが、originalEventはキャッシュされたtouchstartイベントです。したがって、元のイベントでの伝播を停止することは、touchstartイベントがDOMを介して先にバブルアップしてしまったため、何の効果もありません。

解決策?私は、これはハンマーでバグであると信じて - タップイベントでoriginalEventを修正プルリクエストを送信してください。他の人がイベントのターゲットを確認できると示唆しているが、それは常に親要素である - 私の意見では別のバグだ。代わりにevent.originalEvent.targetを確認してください。ここでは実装され、この平凡な解決策とJS fiddleです:http://jsfiddle.net/HHRHR/

+5

注:この質問に対する私の答えは古くなっています.hammer.jsは、これが投稿されて以来大幅に変更されています。 – rharper

+0

TimPetricolaのオリジナルスニペットとほぼ同じコードを使用します。 Hammer.JS - v1.0.5 - 2013-04-07で期待通りの動作を確認できます。 Hammer.jsのように見えます。この問題は真剣に受け止めて解決しました。 – Douwe

0

これが機能しない場合は、必要なことを確認した後でタップで別のメソッドを呼び出してください(arguments.calleeはこのような場合に開始します)。タップされた要素を見つけるために、親ハンドラ内で、他のユーザーをさせるの追加の利点もボタンをフックが...

function myFn(a) { if(a) $(this).css('background', 'red'); else $(this).css('background', 'blue');}

$('#parent').hammer().bind('tap', function(e) { 
    //Check arguments.callee or other data in event and call myFn 
});​​​​​​​​ 

$('#children').hammer().bind('tap', function(e) { 
    //Same here 
}); 
+3

私はその順序でそれらの単語を理解していません... –

+2

'arguments.callee'は[非推奨]です(https://developer.mozilla.org/ja/JavaScript/Reference/Functions_and_function_scope/arguments/callee) –

+0

私はこれは厳密なモードでしかないと思います... https://developer.mozilla.org/ja/JavaScript/Reference/Functions_and_function_scope/arguments/calleeそして、私はそのような小さな事柄を手にして仕事を終わらせないようにしません。 ..これを使用し、終了したら問題に戻ります。 – Jay

0

あなたはe.currentTargetをチェックしてみてください(またはそれがe.targetあります?) ;子要素の場合はただちに戻り、それ以外の場合は関数を続行します。

+0

いいアイデアですが、子供をクリックしても親要素を返します。 – TimPetricola

+0

Hmmm。私はHammerが実際に 'window'オブジェクトにバインドして、すべての計算を行い、タッチイベントのグローバルX/Y座標を計算し、それからどの要素がクリックされたかを判断するという疑いがあります。この場合、stopPropagationは効果を持ちません。しかし、私は[Hammer.jsのソース](https://github.com/EightMedia/hammer.js/blob/master/hammer.js)を一目見てから推測しています! –

3

私はこの仕事を得ることができなかったとして、私は子供のイベントがすでにトリガされたかどうかを知るために変数を使用していました。それはevent.stopPropagation()を呼び出すと、すべてのことになると、されjGesturesと非常によく動作します(私はhammer.jsで試していない)

var childTriggered = false; 

$('#child').bind('tapone', function(e) { 
    $(this).css('background', 'red'); 
    childTriggered = true; 
}); 

$('#parent').bind('tapone', function(e) { 
    if(childTriggered) { 
     childTriggered = false; 
     return;     
    } 
    $(this).css('background', 'blue'); 
}); 

+1

このロジックはhammer.jsでも動作することが確認できます。 –

3

私はタッチイベントと同様の問題を抱えていました。

I)は e.preventDefaultを(呼び出しと同じである

return false; 

を使用して、それを解決しました。 e.stopPropagation();

関連する問題