JQuery: функция click исключает детей.
Попытка обернуть голову вокруг функции jQuery ".not()" и столкнуться с проблемой. Я хотел бы, чтобы родительский div был "кликабельным", но если пользователь нажимает на дочерний элемент, script не вызывается.
$(this).not(children()).click(function(){
$(".example").fadeOut("fast");
});
html:
<div class="example">
<div>
<p>This content is not affected by clicks.</p>
</div>
</div>
Ответы
Ответ 1
Чтобы сделать это, остановите щелчок на дочернем элементе используя .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
Для щелчка ваша проблема заключается в том, что нажимает на дочерние пузырьки до родителя, а не на то, что вы случайно подключили обработчик кликов ребенку.
Ответ 2
Я использую следующую разметку и воспользовался той же проблемой:
<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 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");
}
});
Надеюсь, что это поможет.
Ответ 3
Или вы также можете:
$('.example').on('click', function(e) {
if( e.target != this )
return false;
// ... //
});
Ответ 4
Мое решение:
jQuery('.foo').on('click',function(event){
if ( !jQuery(event.target).is('.foo *') ) {
// code goes here
}
});
Ответ 5
Вот пример. Зеленый квадрат - родитель, а желтый - дочерний элемент.
Надеюсь, что это поможет.
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>
Ответ 6
Лично я бы добавил обработчик кликов к дочернему элементу, который ничего не делал, кроме как остановил распространение клика. Так это будет выглядеть примерно так:
$('.example > div').click(function (e) {
e.stopPropagation();
});