回答:
これを行うには、.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
クリックの場合の問題は、子のクリックが親まで泡立つことであり、誤ってクリックハンドラーを子にアタッチしたことではありません。
e.stopPropagation();
代わりに使用しますreturn false;
。
}).find('.classes-to-ignore').click(function(e) {
して特定の子要素を選択することもできます
e.stopPropagation()
し、次に使用return false
代わりに。return false
これはと同等であるe.preventDefault(); e.stopPropagation()
ため、予期しない副作用が生じる可能性があります。
私は次のマークアップを使用しており、同じ問題を引き起こしていました:
<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");
}
});
お役に立てば幸いです。
.on("click", ...)
、jQueryの最新バージョンで使用する必要があります.live()
。api.jquery.com/liveを
私の解決策:
jQuery('.foo').on('click',function(event){
if ( !jQuery(event.target).is('.foo *') ) {
// code goes here
}
});
個人的には、子要素にクリックハンドラを追加して、クリックの伝播を停止するだけでした。したがって、次のようになります。
$('.example > div').click(function (e) {
e.stopPropagation();
});
stopPropagation
他の回答が示唆するようにfalseを返すこととの違いは何ですか?
stopPropagation
発生する可能性のある子要素のイベントの発生を停止しないため、よりクリーンなようreturn false
です。
例を示します。緑の四角は親であり、黄色の四角は子要素です。
これがお役に立てば幸いです。
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>