jQuery:单击函数exclude children,

2exbekwf  于 2022-12-26  发布在  jQuery
关注(0)|答案(6)|浏览(132)

试图把我的头脑围绕在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>
rta7y2nd

rta7y2nd1#

为此,停止单击子using .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

对于单击,您的问题是click on a child bubbles up to the parent,而不是您无意中将单击处理程序附加到子对象。

b09cbbtk

b09cbbtk2#

我正在使用以下标记,遇到了同样的问题:

<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");
   }
});
szqfcxe2

szqfcxe23#

或者你也可以这样做:

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

   // ... //
});
ioekq8ef

ioekq8ef4#

我的解决方案:

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

xeufq47z5#

我个人会在子元素中添加一个click处理程序,它只会停止点击的传播,看起来像这样:

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

wpx232ag6#

这里有一个例子,绿色的方块是父元素,黄色的方块是子元素。
希望这能有所帮助。

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>

相关问题