stopPropagation()与tap事件

我正在使用hammer.js ,似乎我event.stopPropagation()不适用于tap事件。

如果我单击该子项,则会触发相关事件,但也会触发父事件,我不希望这样。

 $('#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 ,问题似乎是一样的。 如何使用其中一个库实现此结果? (如果需要,可以是另一个)

正如在另一个评论中所提到的,正如你所做的那样,人们会期望调用event.stopPropagation()将是阻止事件冒泡到父级所需的全部内容。

细节:然而,在Hammer.js 中并非如此 。 Hammer为您调用$(el).hammer()每个元素创建一个新的手势状态机。 因此,当浏览器触发子项触摸事件时,它首先由子逻辑处理,然后再由父项逻辑处理。 因此,要阻止父级获取点击事件,您必须阻止父级的锤子状态机获取原始触摸事件 。 通常,调用event.stopPropagation()也会停止原始事件的传播。 但是,hammer.js的tap事件是在touchend上触发的,但originalEvent是缓存的touchstart事件。 因此,停止在原始事件上的传播没有任何效果,因为touchstart事件早已通过DOM冒出来。

解? 我相信这是锤子中的一个错误 – 提交一个拉取请求来纠正tap事件中的originalEvent 。 正如其他人建议您可以检查事件的目标,但这始终是父元素 – 在我看来是另一个错误。 所以请检查event.originalEvent.target 。 这是一个JS小提琴实现这个平庸的解决方案: http : //jsfiddle.net/HHRHR/

由于我无法完成这项工作,我使用变量来了解子事件是否已被触发。 它适用于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'); }); 

触摸事件我遇到了类似的问题。

我用它来解决它

 return false; 

这与调用e.preventDefault()相同; e.stopPropagation();

如果你不能让它工作..只需在validation需要后调用另一个方法( 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 }); 

您可以尝试在父处理程序中检查e.currentTarget (或者是e.target ?)以找出被点击的元素; 如果它是子元素然后立即返回,否则继续该函数。