자녀가 아닌 부모 DIV에서만 클릭 이벤트를 발생시키는 방법은 무엇입니까?


211

클래스가있는 DIV가 foobar있고 해당 DIV 내부에 클래스 가없는 몇 가지 DIV가 있지만 foobar클래스를 상속한다고 가정합니다 .

$('.foobar').on('click', function() { /*...do stuff...*/ });

DIV의 어딘가를 클릭 할 때만 실행되고 자식 DIV는 실행하지 않기를 원합니다.

답변:


439

가와 (과 e.target) 같은 요소 인 this경우 자손을 클릭하지 않은 것입니다.

$('.foobar').on('click', function(e) {
  if (e.target !== this)
    return;
  
  alert( 'clicked the foobar' );
});
.foobar {
  padding: 20px; background: yellow;
}
span {
  background: blue; color: white; padding: 8px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class='foobar'> .foobar (alert) 
  <span>child (no alert)</span>
</div>


그 대답은 의견을 설명 합니다
gdoron은 Monica를 지원합니다.

@gdoron : Adam은 너무 친절합니다. :)

1
안녕하세요 @vicky. 참고로, JavaScript에는 두 가지 종류의 값 평등 비교가 있습니다. ===또는 !==사용하는 "엄격한 평등 비교 알고리즘" , 그동안 ==!=사용 "추상 평등 비교 알고리즘" 형 강압적이다. 강제적 인 유형에 대한 특별한 요구가없는 한 ( 일반적으로 규칙이 약간 복잡하기 때문에) 일반적인 지혜는 항상 엄격한 비교를 사용 하는 것 입니다. 이 경우 객체가 비교되고 있기 때문에 실제로 차이는 없지만 대부분의 사람들은 여전히 엄격한 비교를 고수 할 것 입니다.

1
@vicky : 괜찮습니다. 여전히 옳습니다. JS에게 다른 연산자가 있다고하자. ;-)

3
Vanilla JS addEventListener와 함께 작동 할 수 있으며 jQuery와 관련이 없기 때문에 좋은 대답입니다.
Michael Giovanni Pumo

64

최신 브라우저 만 타겟팅하지 않아도 작동하는 다른 방법이 있습니다. 그냥 CSS를 추가하십시오

pointer-events: none;

클릭을 캡처하려는 div의 모든 하위 사용자에게 지원 테이블은 다음과 같습니다

http://caniuse.com/#feat=pointer-events


13
'감사합니다'라는 의견을 쓰지 말아야한다는 것을 알고 있지만, 다음과 같이 키스 할 수는 있습니다 :-)
Simona Adriani

@SimonaAdriani 응?
n3wb

고마워, 나는 같은 방식으로했지만 주변에서 단위 테스트 사례를 작성하는 데 어려움을 겪고 있습니다. 어떻게 확인 할 수 click의 프로그램에 클릭 이벤트 트리거가 차단되어야 하는가?
Pankaj Parkar

29

버블 링을 유리하게 사용할 수 있습니다.

$('.foobar').on('click', function(e) {
    // do your thing.
}).on('click', 'div', function(e) {
    // clicked on descendant div
    e.stopPropagation();
});

하위 <a>요소 에 대한 클릭 만 제외하고 싶기 때문에 특정 시나리오에 적합한 솔루션처럼 보입니다 . 하나의 문제가 있습니다. 중간 클릭하면 이벤트가 계속 트리거됩니다 (Chrome에서 테스트 됨). 이것을 방지하는 변형이 있습니까?
cgogolin

@cgogolin, 이것 좀보세요 : stackoverflow.com/questions/12197122/…
Jessica

28

나는 받아 들일만한 대답을 얻지 못했지만 적어도 바닐라 JS에서는 트릭을하는 것처럼 보입니다.

if(e.target !== e.currentTarget) return;

1
e.currentTarget는 참조보다 정확한 this물체 때문에 this캔 변화 가리키는 그것이 호출의 범위 및 문맥에 따라
eballeste

20
//bind `click` event handler to the `.foobar` element(s) to do work,
//then find the children of all the `.foobar` element(s)
//and bind a `click` event handler to them that stops the propagation of the event
$('.foobar').on('click', function () { ... }).children().on('click', function (event) {
    event.stopPropagation();
    //you can also use `return false;` which is the same as `event.preventDefault()` and `event.stopPropagation()` all in one (in a jQuery event handler)
});

이렇게하면 click요소의 모든 자식 요소 에서 이벤트 전파 (버블 링)가 중지되어 .foobar이벤트가.foobar 요소에 이벤트 핸들러를 시작 .

데모는 다음과 같습니다. http://jsfiddle.net/bQQJP/


3
$(".advanced ul li").live('click',function(e){
    if(e.target != this) return;
    //code
    // this code will execute only when you click to li and not to a child
})

2

나는 같은 문제가 있었고이 해결책을 찾았다 (다른 답변을 바탕으로)

 $( ".newsletter_background" ).click(function(e) {
    if (e.target == this) {
        $(".newsletter_background").hide();
    } 
});

기본적으로 대상이 div 인 경우 코드를 실행하고 그렇지 않으면 아무것도하지 않습니다 (숨기지 마십시오)


1

내 경우는 비슷하지만, 당신이 거의없는 경우입니다 foobar 한 번의 클릭 당 하나만 닫으려는 경우입니다.

부모 사례 찾기

$(".foobar-close-button-class").on("click", function () {
    $(this).parents('.foobar').fadeOut( 100 );
    // 'this' - means that you finding some parent class from '.foobar-close-button-class'
    // '.parents' -means that you finding parent class with name '.foobar'
});

아동 사례 찾기

$(".foobar-close-button-class").on("click", function () {
    $(this).child('.foobar-close-button-child-class').fadeOut( 100 );
    // 'this' - means that you finding some child class from '.foobar-close-button-class'
    // '.child' -means that you finding child class with name '.foobar-close-button-child-class'
});

1

event.currentTarget을 사용할 수 있습니다. 이벤트를받은 사람 만 클릭 이벤트를 수행합니다.

target = e => {
    console.log(e.currentTarget);
  };
<ul onClick={target} className="folder">
      <li>
        <p>
          <i className="fas fa-folder" />
        </p>
      </li>
    </ul>



0

// if its li get value 
document.getElementById('li').addEventListener("click", function(e) {
                if (e.target == this) {
                    UodateNote(e.target.id);
                }
                })
                
                
                function UodateNote(e) {

    let nt_id = document.createElement("div");
    // append container to duc.
    document.body.appendChild(nt_id);
    nt_id.id = "hi";
    // get conatiner value . 
    nt_id.innerHTML = e;
    // body...
    console.log(e);

}
li{
 cursor: pointer;
    font-weight: bold;
  font-size: 20px;
    position: relative;
    width: 380px;
    height: 80px;
    background-color: silver;
    justify-content: center;
    align-items: center;
    text-align: center;
    margin-top: 0.5cm;
    border: 2px solid purple;
    border-radius: 12%;}
    
    p{
     cursor: text;
  font-size: 16px;
   font-weight: normal;
    display: block;
    max-width: 370px;
    max-height: 40px;
    overflow-x: hidden;}
<li id="li"><p>hi</p></li>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.