2012-07-20 2 views
2

나는 위치에 여러 IMG-객체와 사업부가 : 이벤트는 버블 아래, 무시됩니다 이미지의 이는 MouseDown 핸들러 중 하나가 호출 이제이는 MouseDown 전파

<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

+0

[jsFiddle] (http://jsfiddle.net/)은이 질문을 훨씬 명확하고 쉽게 대답하게 만들 것입니다. –

+0

@madfriend 기본적으로 이미지는 투명한 배경을 가진 모양을 나타내며 이미지의 투명한 부분이 아닌 모양 자체가 클릭 될 때만 mousedown 이벤트가 발생하기를 원합니다. 그 자체로하기는 어렵지 않지만 다른 이미지가 '배경'에있는 동안 투명한 부분을 클릭하면 내가 말했듯이 컨테이너에 직접 버블 링되는 클릭 이벤트가 발생합니다. –

답변

3

모든 이미지에서 히트 테스트를 수동으로 실행하지 않고도이 작업을 수행 할 수있는 방법이 있습니까?

나는 당신이 히트 테스트를 직접 실행해야한다고 생각합니다. 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

이론상으로, 정말 어렵지 않습니다. 하지만 항목에서 조건이 충족 될 때이 절차를 '취소'하는 방법이 필요합니다. 그 순서대로 최하단에서 최하단으로 이동하십시오. 이벤트를 버블 링하고 필요한 경우 전달을 취소하는 것이 가장 좋았을 것입니다. 그렇지 않으면 '기본'레이어로 버블 링하십시오. –

+0

문제는 이벤트가 자식에서 부모에게 거품을 일으킬 수 있거나 전면에서 후면으로 거품이 발생할 수 있다는 것입니다. 이 두 가지는 상호 배타적입니다. 만약 당신이 child-to-parent가 아닌 로직 버블 링을 원한다면, 직접 구현해야합니다. –

+0

알겠습니다. 다른 선택의 여지가 있지만 모든 개체에 '충돌 검사'를 수행 한 다음 충돌이 발견되면 중단됩니다. 나는 당신의 바이올린을 사용하고, 충돌 논리를 추가하고, 앞 항목을 선택하기 위해 순서를 뒤집었다. –