2014-09-20 86 views
1

我有3个元素。每个人都有一个元素,在他们点击时发现他们的父母,并发送它去工作。问题在于点击事件似乎在堆叠。例如,如果我点击元素#1,它将元素#1发送出去。然后,如果我单击元素#3,它会发送元素#1和元素#3。然后,如果我单击元素#2,它将发送元素#1,元素#3和元素#2。我如何才能让它只发送点击事件的一个直接父对象。Jquery单击事件堆栈

相关代码:

$('.tiles ').on('click', '.fa-pencil', function(e){ 
     e.stopPropagation(); 

     var tile = $(this).closest(".live-tile"); 
     showEditDialog(tile); 

    }); 

.tiles是包装类所有的家长份额,.live瓦在于得到送走,.fa铅笔在于被点击孩子的个别家长和showEditDialog正在发送。

编辑----

<div class="tiles"> 
    <!-- <div class="live-tile" > 
     <span id = "bar" class = "tile-title optionsBar"><i class="fa fa-2x fa-pencil"></i><i class="fa fa-2x fa-times-circle"></i></span> 
     <div class ="mainDiv"></div> 
     <span class = "tile-title imageBar"><img class = "image" src = "http://9gag.com/favicon.ico"></img></span> 
     </div>--> 
</div> 

评论中的内容(一切,除了.tiles)动态添加,但是这是它会是什么样子。

+0

你能分享你的标记吗? – Josep 2014-09-20 03:57:24

+0

在编辑中添加了标记 – DasBeasto 2014-09-20 04:02:05

+0

您是否拥有包含类贴图的多个div? – Mic1780 2014-09-20 04:08:46

回答

0

没关系我发现这不是代码中提到的问题。 showEditDialog()函数自己调用了两次,并且出于某种原因冒泡到第二个父元素。我只是将自己的呼叫移除,并且只在后面调用正确的呼叫。

+0

很高兴你找到了解决方案。请你接受你自己的回答,以便其他人(比如我自己)不认为它仍然需要解决?谢谢 – Basic 2014-09-20 16:42:11

-1

因为您正在识别类.tiles的所有按钮,所以您必须每次都将一个UNIQUE子选择器分析到该函数中。

+0

我没有downvote这个,但我认为你错了,.tiles不符合按钮.fa铅笔。我添加了标记,以澄清。并点击$(这个)应该确定具体的一个,对吗? – DasBeasto 2014-09-20 04:02:59

+0

使用标记更有意义,但即使如此,它也与JavaScript创建新变量的方式有关。并且没有$(this)引用回调函数适用的对象,在这种情况下,它将是窗口对象。 – 2014-09-20 04:48:55

2

而不是stopPropagation。试着用stopImmediatePropagation()

切换出来从http://devdocs.io/jquery/event.stoppropagation

防止冒泡DOM树,阻止任何 父处理程序被通知的事件的事件。

http://devdocs.io/jquery/event.stopimmediatepropagation

除了保持从 一个元件上的任何额外的处理程序被执行,该方法也通过隐含 调用event.stopPropagation()停止冒泡。为了简单地阻止冒泡到祖先元素的事件 ,但允许在相同元素上执行其他事件处理程序 ,我们可以使用event.stopPropagation() 来代替。

我认为,因为其他处理程序正在执行它导致您的问题。通过改变它可以防止执行以及冒泡。

+0

可悲的没有改变,我也认为/认为事件处理程序仍然附着在被点击的元素上,但没有任何东西似乎阻止它。 – DasBeasto 2014-09-20 04:07:18