jquery 하위 이벤트 상위 이벤트 트리거


208

onclick이벤트를 첨부 한 div가 있습니다 . 이 div에는 링크가있는 태그가 있습니다. 링크를 클릭하면 onclickdiv 의 이벤트도 트리거됩니다. 링크를 클릭하면 div onclick가 실행되지 않도록 어떻게 비활성화 할 수 있습니까?

스크립트:

$(document).ready(function(){
    $(".header").bind("click", function(){
         $(this).children(".children").toggle();
    });
})

html 코드 :

<div class="header">
    <a href="link.html">some link</a>
    <ul class="children">
        <li>some list</li>
    </ul>
</div>

답변:


411

이 작업을 수행:

$(document).ready(function(){
    $(".header").click(function(){
        $(this).children(".children").toggle();
    });
   $(".header a").click(function(e) {
        e.stopPropagation();
   });
});

당신이 할 경우 더 .stopPropagation 읽어 (), 이쪽을 봐주세요 .


2
누군가에게 도움이된다면, 나는 자녀를 대체 $(".header a")하고 $(".header *")(div, form, input 등) 선택했습니다.
aldo.roman.nurena

1
e.stopPropagation (); 작동하지 않는 한 첫 줄에 작성해야합니다!
ehsan

2
슬프게도이 방법은 rel구성된 라이트 박스가 작동 하지 못하게합니다
eapo

5
xr280xr의 아래 답변은 어린이의 가능한 이벤트를 방해하지 않기 때문에 훨씬 좋습니다.
Alexander Jank

1
해결하는 것보다 더 많은 문제가 발생합니다. 문서 요소에서 클릭 이벤트를 수신하는 타사 플러그인을 상상해보십시오. 클릭에 대해 절대 알 수 없습니다. 라이트 박스에 대한 의견을 참조하십시오.
살만 A

100

또는 다른 처리기를 방지하기 위해 추가 이벤트 처리기를 갖지 않고 click 이벤트 처리기에 전달 된 Event Object 인수를 사용하여 자식의 클릭 여부를 확인할 수 있습니다. target클릭 한 요소가되고 currentTarget.header div가됩니다.

$(".header").click(function(e){
     //Do nothing if .header was not directly clicked
     if(e.target !== e.currentTarget) return;

     $(this).children(".children").toggle();
});

8
나에게 이것은 모든 자식 요소에 명시적인 preventDefault ()를 추가 할 필요가 없기 때문에보다 우아한 솔루션입니다.
Ryan Griggs

5
수락 된 답변과 달리 어린이에 대한 독립적 인 이벤트가있는 경우 작동합니다. 확실히 더 깨끗하고 더 나은 솔루션
BozanicJosip

2
대부분의 상황에서는이 점에 신경 쓰지 않지만 어떤 이유로 든 IE6-8을 지원해야하는 경우에는 이 기능이 없습니다currentTarget . 해결 방법은 다른 답변this 에서 제안한대로 로 바꾸는 것입니다 .
Alexander Jank

클릭 수를 늘리기 위해 추가 리스너를 설정하는 것보다 깨끗한 솔루션입니다.
마이크로

이 코드는 나에게 더 효과적이었다. var target = $ (e.target); if (! target.is ( "span")) return;`
Cr1xus

17

체인과 함께 on () 을 사용하여 더 나은 방법

$(document).ready(function(){
    $(".header").on('click',function(){
        $(this).children(".children").toggle();
    }).on('click','a',function(e) {
        e.stopPropagation();
   });
});

4

여기에 대한 답변은 OP의 질문을 문자 그대로 받아 들였습니다. 이러한 답변을 단일 <a>태그 뿐만 아니라 많은 하위 요소가있는 시나리오로 어떻게 확장 할 수 있습니까? 한 가지 방법이 있습니다.

배경이 검게 표시된 사진 갤러리가 있고 브라우저의 중앙에 사진이 있다고 가정 해 봅시다. 검은 색 배경을 클릭하면 (배경 안에는 없음) 오버레이를 닫고 싶습니다.

가능한 HTML은 다음과 같습니다.

<div class="gallery" style="background: black">
    <div class="contents"> <!-- Let's say this div is 50% wide and centered -->
        <h1>Awesome Photos</h1>
        <img src="img1.jpg"><br>
        <img src="img2.jpg"><br>
        <img src="img3.jpg"><br>
        <img src="img4.jpg"><br>
        <img src="img5.jpg">
    </div>
</div>

JavaScript는 다음과 같이 작동합니다.

$('.gallery').click(
    function()
    {
        $(this).hide();
    }
);

$('.gallery > .contents').click(
    function(e) {
        e.stopPropagation();
    }
);

이렇게하면 .contents모든 조사에서 내부 요소의 클릭 이벤트가 중지 .gallery되므로 어두운 검정색 배경 영역을 클릭 할 때만 갤러리가 닫히지 만 컨텐츠 영역을 클릭하면 갤러리가 닫히지 않습니다. 이것은 많은 다른 시나리오에 적용될 수 있습니다.


4

나는이 질문에 걸려 다른 대답을 찾았습니다.

모든 어린이 가 부모를 촉발 하지 못하도록 하고 싶었습니다 .

자바 스크립트 :

document.getElementById("parent").addEventListener("click",  function (e) {
    if (this !== event.target) return;
    // Do something
});

jQuery :

$("#parent").click(function () {
    // Do something
}).children().on("click", function (e) {
    e.stopPropagation();
});

0

아니면 이거:

$(document).ready(function(){
    $(".header").click(function(){
        $(this).children(".children").toggle();
    });
   $(".header a").click(function(e) {
        return false;
   });
});

2
@ Halcyon991 e는 어떤 식 으로든 인수를 통해 전달됩니다. e는 단지 참조입니다
qodeninja

@qodeninja 그래, 사용하지 않으면 불필요한 문자 추가.
Halcyon991

return false링크에 포인트를 추가하지 않아도 클릭 할 수 있어야합니다.
eapo

0

가장 간단한 해결책은이 CSS를 자식에 추가하는 것입니다.

.your-child {
    pointer-events: none;
}

워드 프레스에 의해 추가 된 원치 않는 폰트 태그를 위해 이것이 필요했고 그것은 나를 위해 일했다
Ndm Gjr

-1

더 짧은 방법 :

$('.header').on('click', function () {
    $(this).children('a').on('click', function(e) {
        e.stopPropagation();
        $(this).siblings('.children').toggle();
    });
});

그러나 ... 헤더를 클릭 할 때 아무 것도하지 않습니다.
Liora Haydont

헤더를 클릭 할 때마다 자식 ( 'a')에 새로운 클릭 이벤트가 추가 됩니다.
Frank Forte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.