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

다음을 고려하세요:

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

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



답변

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>


답변

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

  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; [...]"

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


답변

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;
    }
}


답변

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

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


답변

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

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


답변

이것은 나를 위해 일했다

<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>


답변

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
}