2011-05-19 78 views
4

我使用以下color picker它工作正常,但是当我点击颜色选择器图标时,我不想它冒泡到身体。所以我尝试了以下,现在颜色选择器不工作。jQuery stopPropagation不工作

检查http://jsfiddle.net/CWGgM/

如果你从jsfiddle中删除下面的代码,那么它的工作原理。是什么原因造成这种

$('#test').click(function(e){ 
    e.stopPropagation(); 
}); 
+0

你链接到正确的小提琴? – alex 2011-05-19 05:26:44

+0

@alex oops。固定。它是http://jsfiddle.net/CWGgM/ – Pinkie 2011-05-19 05:27:37

回答

3

这似乎是使用自己的live() style code,在事件被允许冒泡并在document进行处理。

因此,事件必须传播到document或他们不会工作。

您可避免事件触发机身采用以下解决方法......

$('body').click(function(event) { 
    if ($(event.target).parent()[0] == $('.mColorPickerTrigger')[0]) { 
     return true; 
    } 
}); 

jsFiddle

或者,这可能与多个拾色器更好地工作......

$('body').click(function(event) { 
    if ($(event.target).parent().hasClass('mColorPickerTrigger')) { 
     return true; 
    } 
}); 

jsFiddle

+0

谢谢,这适用于图标的特定情况,但它希望div #test内的所有内容不会冒泡到正文,这就是为什么我使用包装#test。这仍然是可能的。 – Pinkie 2011-05-19 07:33:45

1

就像@alex提到的那样,颜色选择器似乎在使用live()来监听整个文档的点击。在阻止传播之前,您可以检查事件是否源自颜色选择器,如果它发生了,就让它起泡。您需要使用closest(),因为可以单击颜色选择器图标的<span>容器或<img>元素。

$('#test').click(function(e){ 
    if($(e.target).closest('.mColorPickerTrigger').length) return; 
    e.stopPropagation(); 
}); 

检查出的jsfiddle演示:http://jsfiddle.net/CWGgM/1/

+0

是的,但你拥有它的方式,它仍然会冒泡到身体。我相信既然颜色选择器是用来制作文档的,那么就没有办法解决这个问题了。 – Pinkie 2011-05-19 18:13:32

+0

我的解决方案阻止**所有内容,但是**颜色选择器的单击事件,为什么会出现这种问题?它实际上是一种与您接受的解决方案类似的解决方案,除非您单击图标旁边的'',否则,如果启用'stopPropagation()'行,我无法获得任何已接受的答案,这就是你想要做的第一件事。在我的示例中,其他所有事情都停止在div上传播*,阻塞的警报不在主体上,但是在调用实际可行的'stopPropagation()'之前。 – DarthJDG 2011-05-19 18:26:27

+0

你的解决方案仍然泡在身体上,这不是我想要的。检查http://jsfiddle.net/CWGgM/2/ – Pinkie 2011-05-19 18:44:26