鼠标按下传播

问题描述:

我与位置的几个IMG的对象一个div:绝对的,像这样:鼠标按下传播

<div> 
    <img> 
    <img> 
    <img> 
    <img> 
</div> 

现在,当图像的鼠标按下处理程序之一被调用时,事件只会泡下来,无视其他图像,即使它们可能在彼此后面。

$('img').mousedown((event) -> if(something) event.stopPropagation()); 
$('div').mousedown(-> alert('event came through')); 

我试图巢他们解决此问题,但没有工作,要么:

<div> 
    <img>  
    <div> 
     <img> 
     <div> 
      <img> 
      ... 
     </div> 
    </div> 
</div> 

有什么方法可以让我得到这个无需手动运行命中测试工作在每张图片上?

+1

你想达到什么样的? – madfriend 2012-07-20 21:24:22

+0

[jsFiddle](http://jsfiddle.net/)会使这个问题更加清晰和容易回答。 – 2012-07-20 21:27:46

+0

@madfriend基本上这些图像代表具有透明背景的形状,而我只希望在单击形状本身时触发mousedown事件,而不是图像的透明部分。这本身并不难做到,但如同我所说,在另一个图像位于“背景”中时单击透明部分将导致直接向容器冒泡的单击事件。 – 2012-07-20 22:20:46

有没有什么办法可以在没有手动运行每个图像的命中测试的情况下工作?

我相信这是正确的,你必须自己运行一次命中测试。 mousedown只出现在鼠标指针下的最前面的元素上,而不是所有元素在那些(x, y)坐标处。

实际上,这并不难。这里有一个工作示例:http://jsfiddle.net/TrevorBurnham/GBuZz/

在这个例子中,mousedown事件被捕获容器元素上像这样处理的:

$('#container').on 'mousedown', (e) -> 
    {pageX, pageY} = e 
    $(@).children().each (i) -> 
    {top, left} = $(@).offset() 
    if top <= pageY <= top + $(@).outerHeight() && 
     left <= pageX <= left + $(@).outerWidth() 
     console.log 'collision with box ' + i​ 
+0

理论上,这并不是很难,是的。 但是我需要一种方法来取消这个过程,当条件满足时,从一个项目的最前面到最后面。如果有必要的话,在事件中冒泡并取消传播将是最优雅的,否则让它冒泡到“基础”层。 – 2012-07-20 22:15:58

+0

问题是事件可能会从孩子到父母冒泡,或者他们可能从前到后冒泡。这两者是相互排斥的。如果你想要冒泡的逻辑,而不是孩子到父母,你必须自己实现它。 – 2012-07-20 23:30:00

+0

我明白了。别无选择,只能对每个对象执行“碰撞检查”,然后在发现碰撞时断开。我用你的小提琴,添加了我的碰撞逻辑,并颠倒了顺序来选择前面的项目。 – 2012-07-20 23:54:00