jQuery : 클릭 기능 제외 자식.


144

jQuery ".not ()"함수를 둘러보고 문제가 발생했습니다. 부모 div를 "클릭 가능"하도록하고 싶지만 사용자가 자식 요소를 클릭하면 스크립트가 호출되지 않습니다.

$(this).not(children()).click(function(){
   $(".example").fadeOut("fast");
});

HTML :

<div class="example">
   <div>
      <p>This content is not affected by clicks.</p>
   </div>
</div>

답변:


198

이렇게하려면 .stopPropagation을 사용 하여 자식 클릭을 중지하십시오 .

$(".example").click(function(){
  $(this).fadeOut("fast");
}).children().click(function(e) {
  return false;
});

이렇게하면 하위 클릭이 해당 수준을 넘어 버블 링되는 것을 막아서 부모가 클릭을받지 못하게됩니다.

.not() 약간 다르게 사용됩니다. 예를 들어 다음과 같이 선택기에서 요소를 필터링합니다.

<div class="bob" id="myID"></div>
<div class="bob"></div>

$(".bob").not("#myID"); //removes the element with myID

클릭에 대한 문제는 실수로 클릭 핸들러를 첨부 한 것이 아니라 자식 클릭이 부모까지 버블 링 된다는 것입니다.


고마워 닉, 나는 이것이 내가 찾고있는 것이라고 생각하지 않습니다. 내 질문에 명확하지 않은 것이 유감입니다. 자식 div를 클릭 할 때가 아닌 부모 요소를 클릭 할 때만 전체 div.example이 fadeOut되기를 원합니다. 그 이유는 사용자가 단락 텍스트를 클릭하고 텍스트 fadeOut을 갖지 않기를 원하기 때문입니다. 사용자가 외부 div (부모 div)를 클릭하면 모든 것이 사라집니다.
superUntitled

@superUntitled-설명 주셔서 감사합니다 ...이 작업을 수행하기 위해 답변이 업데이트되었습니다.
Nick Craver

18
@Asaf- 이 경우 e.stopPropagation();대신 사용하십시오 return false;.
Nick Craver

2
}).find('.classes-to-ignore').click(function(e) {특정 하위 요소를 선택 하는 데 사용할 수도 있습니다
Paul Mason

5
왜 그에게 사용 e.stopPropagation()하고 return false대신 사용하라고 말했는지 이해가 가지 않습니다 . return false에 해당 e.preventDefault(); e.stopPropagation()예기치 않은 부작용이있을 수 있으므로.
Steen Schütt

183

다음 마크 업을 사용하고 있으며 동일한 문제를 권장했습니다.

<ul class="nav">
    <li><a href="abc.html">abc</a></li>
    <li><a href="def.html">def</a></li>
</ul>

여기에 나는 다음과 같은 논리를 사용했습니다.

$(".nav > li").click(function(e){
    if(e.target != this) return; // only continue if the target itself has been clicked
    // this section only processes if the .nav > li itself is clicked.
    alert("you clicked .nav > li, but not it's children");
});

정확한 질문과 관련하여 다음과 같이 작동한다는 것을 알 수 있습니다.

$(".example").click(function(e){
   if(e.target != this) return; // only continue if the target itself has been clicked
   $(".example").fadeOut("fast");
});

또는 물론 다른 방법으로 :

$(".example").click(function(e){
   if(e.target == this){ // only if the target itself has been clicked
       $(".example").fadeOut("fast");
   }
});

희망이 도움이됩니다.


28
이것이 더 나은 해결책이라고 생각합니다. 어떤 식 으로든 아이들을 방해하지 않으며 수천 명의 자녀가있는 경우 수천 개의 콜백을 등록하지 않기 때문에 더 나은 성능을 발휘해야합니다.
LucasB

4
@ l2aelba- v1.7 이후 폐기 .on("click", ...)된 최신 버전의 jQuery 를 사용해야합니다 .live().
Chris

예, @Chris I은 11 월 16 일 12시 10:12에 게시
l2aelba

죄송합니다. 귀하의 ID를 참조 할 필요는 없습니다. 나는이 답변을 읽는 다른 사람들을 위해 주석을 크게 추가했습니다.
Chris

1
자식 요소의 클릭 이벤트를 방해하지 않기
때문에이

24

또는 다음을 수행 할 수도 있습니다.

$('.example').on('click', function(e) { 
   if( e.target != this ) 
       return false;

   // ... //
});

자식 요소에서 click 이벤트를 피하려면 false를 반환해야합니다. 개정이 잘못되었습니다
dani24

6

내 해결책 :

jQuery('.foo').on('click',function(event){
    if ( !jQuery(event.target).is('.foo *') ) {
        // code goes here
    } 
});

위의 솔루션과 유사합니다.
user460114

3

나는 개인적으로 클릭 전파를 멈추는 것 외에는 아무것도하지 않는 자식 요소에 클릭 핸들러를 추가 할 것입니다. 따라서 다음과 같이 보일 것입니다.

$('.example > div').click(function (e) {
    e.stopPropagation();
});

stopPropagation다른 답변에서 제안한 것처럼 거짓을 반환 하는 것과 차이점은 무엇 입니까?
Crashalot

나는이 경우에 그것들이 기능적으로 동일하다고 생각하지만, 전파 중단은 수행중인 작업의 목적에 더 명확하고 나중에 수행되는 이유를 더 잘 이해할 수 있다고 생각합니다. 그러나 논쟁의 여지가 있습니다.
Noahone

설명 주셔서 감사합니다. stopPropagation하위 요소에 대한 이벤트가 발생하지 않도록하므로 더 깨끗해 보일 수 있습니다 return false.
Crashalot

0

다음은 예입니다. 녹색 사각형은 부모이고 노란색 사각형은 자식 요소입니다.

이것이 도움이되기를 바랍니다.

var childElementClicked;

$("#parentElement").click(function(){

		$("#childElement").click(function(){
		   childElementClicked = true;
		});

		if( childElementClicked != true ) {

			// It is clicked on parent but not on child.
      // Now do some action that you want.
      alert('Clicked on parent');
			
		}else{
      alert('Clicked on child');
    }
    
    childElementClicked = false;
	
});
#parentElement{
width:200px;
height:200px;
background-color:green;
position:relative;
}

#childElement{
margin-top:50px;
margin-left:50px;
width:100px;
height:100px;
background-color:yellow;
position:absolute;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parentElement">
  <div id="childElement">
  </div>
</div>

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