인라인 onclick 속성으로 이벤트 전파를 중지하는 방법은 무엇입니까?


313

다음을 고려하세요:

<div onclick="alert('you clicked the header')" class="header">
  <span onclick="alert('you clicked inside the header');">something inside the header</span>
</div>

사용자가 범위를 클릭 할 때 div의 클릭 이벤트가 발생하지 않도록하려면 어떻게해야합니까?

답변:


272

event.stopPropagation ()을 사용하십시오 .

<span onclick="event.stopPropagation(); alert('you clicked inside the header');">something inside the header</span>

IE의 경우 : window.event.cancelBubble = true

<span onclick="window.event.cancelBubble = true; alert('you clicked inside the header');">something inside the header</span>

11
FireFox에는 이벤트 객체와 같은 것이 없습니다.
Robert C. Barth

6
이벤트 객체는 콜백의 매개 변수입니다. 실제로,이 객체는 함수의 매개 변수가 아닌 window.event를 통해 액세스 할 수 있기 때문에 IE의 이벤트 객체와 같은 것은 없습니다 :
Vincent Robert

66
인라인 onclick 핸들러는 이벤트를 인수로 전달하지 않습니다. 올바른 해결책은 아래 Gareths입니다.
Benubird

2
Firefox에서는 인라인 스크립트에서 변수 이벤트에 액세스 할 수 있지만 window.event를 사용할 수 없습니다. <div onclick = "alert (event);"> </ div>
Morgan Cheng

1
eventIOS Safari에서도 인라인 이벤트에서 사용할 수있는 것 같습니다.
Yuval A.

210

함수 안에서 이벤트 객체를 얻는 방법은 두 가지가 있습니다.

  1. W3C 호환 브라우저 (Chrome, Firefox, Safari, IE9 +)의 첫 번째 주장
  2. Internet Explorer의 window.event 객체 (<= 8)

W3C 권장 사항을 따르지 않는 레거시 브라우저를 지원해야하는 경우 일반적으로 함수 내에서 다음과 같은 것을 사용합니다.

function(e) {
  var event = e || window.event;
  [...];
}

먼저 하나를 확인한 다음 다른 하나를 확인하고 이벤트 변수에서 찾은 것을 저장하십시오. 그러나 인라인 이벤트 핸들러에는 e사용할 객체 가 없습니다 . 이 경우 arguments항상 사용 가능한 컬렉션을 활용 해야하며 함수에 전달 된 전체 인수 세트를 나타냅니다.

onclick="var event = arguments[0] || window.event; [...]"

그러나 일반적으로 전파 중지와 같은 복잡한 작업이 필요한 경우 인라인 이벤트 핸들러를 피해야합니다. 이벤트 처리기를 개별적으로 작성하고 요소에 첨부하는 것은 가독성과 유지 관리 성을 위해 중장기 적으로 훨씬 더 좋습니다.


11
인라인 리스너 onclick="foo(event)"에서 다음 과 같은 이벤트 객체를 전달한 다음 함수에서 전달할 수 있습니다 function foo(event){/* do stuff with event */}. 이것은 IE 및 W3C 이벤트 모델 모두에서 작동합니다.
RobG

5
"8 이하"는 다소 ... 모호합니다.
TechNyquist

8
이것은 실제로 질문에 대답하지 않습니다.
jcomeau_ictx

1
다른 질문에 대한 깔끔한 답변. :-/
Arel

80

window.event는 FireFox에서 지원되지 않으므로 다음 행을 따라야합니다.

e.cancelBubble = true

또는 FireFox에 W3C 표준을 사용할 수 있습니다.

e.stopPropagation();

화려하고 싶다면 다음과 같이하십시오.

function myEventHandler(e)
{
    if (!e)
      e = window.event;

    //IE9 & Other Browsers
    if (e.stopPropagation) {
      e.stopPropagation();
    }
    //IE8 and Lower
    else {
      e.cancelBubble = true;
    }
}

12
그리고 그것이 작동하게하려면 다음과 같이 호출해야합니다.<div onclick="myEventHandler(event);">
DarkDust

1
"event || window.event"일 수 있습니다.
Pointy

1
(e.cancelBubble)가 제게 맞지 않으면 이미 참이면 true로 설정 한 것입니다.
Guillaume86

e.cancelBubbleIE에서 false를 반환합니다! e.cancelBubble = true;명령에 도달 할 수 없습니다 . 대신 SoftwareARM의 조건을 사용하십시오!
mauretto

45

이 기능을 사용하면 올바른 방법이 있는지 테스트합니다.

function disabledEventPropagation(event)
{
   if (event.stopPropagation){
       event.stopPropagation();
   }
   else if(window.event){
      window.event.cancelBubble=true;
   }
}

20

같은 문제가 있습니다-IE의 JS 오류 상자-이것은 내가 볼 수있는 한 모든 브라우저에서 제대로 작동합니다 (event.cancelBubble = true는 IE에서 작업을 수행함)

onClick="if(event.stopPropagation){event.stopPropagation();}event.cancelBubble=true;"

1
@MSC에게 꼭 필요한 감사합니다!
DannyC

1
인라인 스크립트. 그것은 질문에 대답하지 않습니다
Cesar

10

이것은 나를 위해 일했다

<script>
function cancelBubble(e) {
 var evt = e ? e:window.event;
 if (evt.stopPropagation)    evt.stopPropagation();
 if (evt.cancelBubble!=null) evt.cancelBubble = true;
}
</script>

<div onclick="alert('Click!')">
  <div onclick="cancelBubble(event)">Something inside the other div</div>
</div>

이 정확한 코드 스 니펫이 효과가 있었습니까? 외부 div의 onclick 핸들러에 문자열 인용 문제가있는 것처럼 보이기 때문에 ...?!
니콜

7

MVC가 아닌 ASP.NET 웹 페이지 Sys.UI.DomEvent의 경우 기본 이벤트의 래퍼로 객체를 사용할 수 있습니다 .

<div onclick="event.stopPropagation();" ...

또는 내부 함수에 매개 변수로 이벤트를 전달하십시오.

<div onclick="someFunction(event);" ...

그리고 어떤 기능에서 :

function someFunction(event){
    event.stopPropagation(); // here Sys.UI.DomEvent.stopPropagation() method is used
    // other onclick logic
}


2

나는 Karma 때문에 주석을 달 수 없으므로 이것을 전체 답변으로 작성하십시오 : Gareth의 답변에 따르면 (var e = arguments [0] || window.event; [...]) 빠른 해킹 :

<div onclick="(arguments[0] || window.event).stopPropagation();">..</div>

늦었다는 것을 알고 있지만 이것이 한 줄로 작동한다는 것을 알려 드리고자합니다. 중괄호는 두 경우 모두 stopPropagation 함수가 첨부 된 이벤트를 반환하므로 if 및 ... 에서처럼 중괄호로 묶으려고했습니다. :)


1

이것은 또한 작동합니다-링크 HTML에서 다음과 같이 onclick을 사용하십시오 :

<a href="mypage.html" onclick="return confirmClick();">Delete</a>

그리고 comfirmClick () 함수는 다음과 같아야합니다.

function confirmClick() {
    if(confirm("Do you really want to delete this task?")) {
        return true;
    } else {
        return false;
    }
};

2
이것은 질문의 의미가 아닙니다.
jzonthemtn

@jbird 이것이 바로 질문의 의미입니다. 이벤트가 dom 트리를 버블 링하는 것을 취소하는 다른 (오래된) 방법입니다 (dom api 레벨 1 사양에 있음).
gion_13

@ gion_13 그러나 클릭 동작은 사용자가 확인해야하는 것이 아닙니다. 문제에서 우리는 자식의 onclick () 만 실행하고 부모의 onclick ()은 실행하지 않기를 원합니다. 그 사이에 사용자 프롬프트를 넣는 것은 도움이되지 않습니다. 이 차이를 볼 수 있기를 바랍니다.
jzonthemtn

1
confirm관련이 없습니다. 반환 값을 참조하고 있습니다. 인용구 : 링크 HTML에서 다음 과 같이
gion_13

링크 다음 거짓 CANCEL (취소)를 반환, 내 크롬에 전파를 취소 나던
commonpike

1

클릭 한 요소를 확인하는 것이 어떻습니까? 당신이 뭔가를 클릭하면 window.event.target클릭 된 요소에 할당, 클릭 한 요소는 인수로 전달 될 수있다.

대상과 요소가 동일하지 않은 경우 전파 된 이벤트입니다.

function myfunc(el){
  if (window.event.target === el){
      // perform action
  }
}
<div onclick="myfunc(this)" />

고마워 친구, 이것은 가장 깨끗한 해결책 인 것 같습니다. 참고로, 클릭 한 요소가 실제 최상위 요소 인 경우에만 일치한다는 점을 고려해야합니다.
Simon Mattes

0
<div onclick="alert('you clicked the header')" class="header">
  <span onclick="alert('you clicked inside the header'); event.stopPropagation()">
    something inside the header
  </span>
</div>

0

가장 좋은 해결책은 javascript 함수를 통해 이벤트를 처리하는 것이지만 html 요소를 직접 사용하여 간단하고 빠른 솔루션을 사용하기 위해서는 "event"및 "window.event"가 더 이상 사용되지 않으며 보편적으로 지원되지 않습니다 ( https://developer.mozilla.org/en-US/docs/Web/API/Window/event ) 다음과 같은 "하드 코드"를 제안합니다.

<div onclick="alert('blablabla'); (arguments[0] ? arguments[0].stopPropagation() : false);">...</div>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.