2010-01-06 5 views
8

두 개의 div가 있고 큰 것보다 작은 것, 각 div에는 자체 OnClick 메서드가 있습니다. 내가 가진 문제는 내가 작은 div를 클릭했을 때, 큰 div의 OnClick 메서드도 호출된다는 것입니다.두 개의 서로 다른 두 개의 div에서 OnClick

누구를 피할 수 있습니까?

+0

요소가 중첩되어 있다고 가정합니다. – SLaks

+0

데모를 게시 할 수 있습니까? http://jsbin.com을 사용할 수 있습니다. – SLaks

답변

6

클릭 된 요소를 감지하는 가장 좋은 방법은 (이벤트를 클릭) 이벤트의 대상을 분석하는 것입니다. 나는이 사건에 대한 작은 모범을 보냈다. 아래 코드에서 확인할 수 있습니다. 당신이 당신의 스크립트

 
<style> 
#one 
{ 
    width: 200px; 
    height: 300px; 
    background-color: red; 
} 
#two 
{ 
    width: 50px; 
    height: 70px; 
    background-color: yellow; 
    margin-left: 10; 
    margin-top: 20; 
} 

</style> 



<div id="one" onclick="oneClick(event, this);"> 
    one 
    <div id="two" onclick="twoClick(event, this);"> 
     two 
    </div> 
</div> 

나는이 도움이 되었으면 좋겠를 실행하기 전에

 
function amIclicked(e, element) 
{ 
    e = e || event; 
    var target = e.target || e.srcElement; 
    if(target.id==element.id) 
     return true; 
    else 
     return false; 
} 
function oneClick(event, element) 
{ 
    if(amIclicked(event, element)) 
    { 
     alert('One is clicked'); 
    } 
} 
function twoClick(event, element) 
{ 
    if(amIclicked(event, element)) 
    { 
     alert('Two is clicked'); 
    } 
} 

이 자바 스크립트 방법

는 호출 할 수 있습니다.

+0

많은 도움을 드리겠습니다. 고마워요! – Santiago

+0

마지막으로 답변을 혼합하여 작동합니다. event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); 창이 표시됩니다.이벤트가 파이어 폭스에서 작동하지 않는다면 이유는 모르겠다. – Santiago

+0

'window.event'는 비표준 IE 속성이다. – SLaks

5

click 이벤트가 요소 트리 위로 전파됩니다. 따라서 클릭 된 요소가 포함 된 각 요소는 click 이벤트도 발생시킵니다.

가장 간단한 해결책은 return false 처리기를 추가하는 것입니다.

당신이 jQuery를 사용하는 경우, 당신은 그렇지 e.stopPropagation();를 호출 할 수 있습니다, 당신은 존재하는 경우 e.stopPropagation()를 호출해야하고, event.cancelBubble = true을 설정합니다.

자세한 내용은 here을 참조하십시오.

+0

고마워, 그게 내가 생각한거야하지만 그것은 간단하지 않습니다. – Santiago

+0

고맙습니다 만 작동하지만 사소한 오타가 있습니다. 당신은'e.StopPropagation();'을 썼지 만'e.stopPropagation(); '이어야합니다. –

+1

@SizzlePants : 고마워요. 결정된. – SLaks

0

www.jquery.com과 같은 javascript 라이브러리를 사용하기로 결정한 경우 전파 방지 옵션을 사용하여 수행하려는 작업을 쉽게 수행 할 수 있습니다.

+0

jQuery 나 다른 어떤 것도 사용할 필요가 없습니다. 일반 자바 스크립트로 쉽게 할 수 있습니다. –

3

처리중인 것은 이벤트 버블 링입니다. 이 기사를보십시오 : http://www.quirksmode.org/js/events_order.html. 이벤트 전파의 일반적인 경우에

document.getElementById('foo').onClick = function(e) { 

    // Do your stuff 

    // A cross browser compatible way to stop propagation of the event: 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 
+1

그 함수의 첫번째 줄은'e = e || window.event; ' – gnarf

+0

Chrome에서 작동하지만 Firefox에서'window.event is undefined '라고 말합니다. – Santiago

2

실행중인 : 기본적으로

는 부모 요소에 통과 이벤트를 중지하려면, 다음과 같이 사용할 수 있습니다. quirksmode.org을 확인하여 정확히 무슨 일이 일어나고 있는지 자세히 알아보십시오. 기본적으로, 당신이 작은 사업부의 클릭 핸들러에서해야 할 것은 이것이다 :

if (!e) var e = window.event; 
e.cancelBubble = true; 
if (e.stopPropagation) e.stopPropagation(); 
관련 문제